leetcode 4 尋找兩個有序陣列的中位數

2021-09-19 06:42:09 字數 1214 閱讀 6797

題目描述:

難度:困難

給定兩個大小為 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,...