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

2021-10-03 09:07:32 字數 2127 閱讀 4035

題目時間複雜度要求不高於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...