題目時間複雜度要求不高於o(log(m+n)),m,n分別是兩個陣列的長度。對數級的時間複雜度就應該用二分查詢來做了。整體思路就是:先分別找到兩個陣列的中位數a,b,如果ab,說明整體中位數字於a的前半段或b的後半段。不斷這樣二分下去即可。
其實,這道題可以轉換為尋找有序陣列中的第k個數,對應於中位數的話,k=(m+n)/2。尋找過程如上。最後時間複雜度還可。官方給出的解答實在是讓人頭大,不通用,要是在面試情況下,基本上做不出來。
#處理某個陣列為空陣列的情況
if n1 ==0:
if n2&1==
1:#陣列長度為奇數
return nums2[n2//2]
return
(nums2[n2//2]
+ nums2[n2//2-
1])/
2if n2 ==0:
if n1&1==
1:return nums1[n1//2]
return
(nums1[n1//2]
+ nums1[n1//2-
1])/
2 l = n1 + n2
if l&1==
1:#總數為奇數時,尋找的第k個數就是l//2+1
return self.find_kth(nums1,
0, nums2,
0, n1, n2, l//2+
1)#總數為偶數的情況
return
(self.find_kth(nums1,
0, nums2,
0, n1, n2, l//2)
+ self.find_kth(nums1,
0, nums2,
0, n1, n2, l//2+
1))/
2def
find_kth
(self, nums1, start1, nums2, start2, n1, n2, k)
:if start1 >= n1:
#起始索引大於等於陣列長度,說明總體的第k個數,就是另外乙個陣列中的第k個數
return nums2[start2+k-1]
if start2 >= n2:
return nums1[start1+k-1]
if k ==1:
#k最小為1
return
min(nums1[start1]
, nums2[start2]
) mid1 =
float
('inf'
) mid2 =
float
('inf'
)if start1 + k//2-
1< n1:
mid1 = nums1[start1+k//2-
1]if start2 + k//2-
1< n2:
mid2 = nums2[start2+k//2-
1]#如果陣列1的中位數小於陣列2的,說明第k個數在陣列1的前半段或陣列2的後半段,
#則陣列1的初始索引要向後移k/2,陣列2起始索引不變,同時減小k,因為整體尋找範圍在縮小。
#陣列1中位數大於陣列2中位數,同理。
if mid1 < mid2:
return self.find_kth(nums1, start1+k//
2, nums2, start2, n1, n2, k-k//2)
return self.find_kth(nums1, start1, nums2, start2+k//
2, n1, n2, k-k//
2)
leetcode尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...
LeetCode 尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...
二 Leetcode演算法尋找兩個有序陣列的中位數
1 題目 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。nums1 1,3 nums2 2 則中位數是 2.0 nums1 1,2 nums2...