題目描述:
難度:困難
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。
請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。
你可以假設 nums1 和 nums2 不會同時為空。
解題思路:
此題雖然定義難度為「困難」,但可能因為我對選擇排序演算法比較熟悉,並沒有覺得這題有多難。很快就反應出解題思路:先定義兩個變數i和j分別指向陣列nums1和nums2的頭部,分別移動i、j來遍歷兩個陣列,誰對應的元素比較小就移動誰,這樣移動下來的順序就是兩個陣列合併在一起的排序。對於有序的合併陣列,如果合併陣列長度為奇數,則中間的數字就是中位數,對應的全域性索引為(m+n)/2;如果合併陣列的長度為偶數,則中間的兩個數字就是中位數,對應的全域性索引為(m+n)/2和(m+n)/2-1,對這兩個數字求平均即可得最終結果。
該題目比較值得注意的一點是:對於異常處理的考慮,也就是nums1為空或者nums2為空的情況,以及各自只有乙個元素的情況。最後,當各自只有乙個元素時,是num1[0]>=nums2[0]還是相反。這些情況都測試沒問題了,才能算是沒問題。
另一種思路是採用二分查詢和遞迴的方式來做,不斷的排除掉不可能的數字,剩下的就是最終結果,這種思路回頭有空再來補齊。
笨方法:
class solution(object):
def findmediansortedarrays(self, nums1, nums2):
""":type nums1: list[int]
:type nums2: list[int]
:rtype: float
"""m,n=len(nums1),len(nums2)
i,j,cnt,ans=0,0,0,0 #nums1,nums2的索引
while i=n or (ians=nums1[i]
i+=1
else:
ans=nums2[j]
j+=1
if (m+n)%2==1:
if cnt==int((m+n)/2):
return ans*1.0
else:
if cnt==int((m+n)/2):
return (ans+pre_ans)*1.0/2
cnt+=1
return 0
LeetCode 4 尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...
LeetCode 4 尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列nums1和nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設nums1和nums2不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0示例 2 nums1 1,2 nums2 3,...
LeetCode4 尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列nums1和nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設nums1和nums2不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0示例 2 nums1 1,2 nums2 3,...