二分法的hard題目。
leetcode4. 尋找兩個有序陣列的中位數難就難在時間複雜度上。如果不考慮這點,用歸併排序的merge思路解決,複雜度o(m+n).給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。
請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。
你可以假設 nums1 和 nums2 不會同時為空。
# 歸併的merge步驟,o(m+n)
class
solution
:def
findmediansortedarrays
(self, nums1: list[
int]
, nums2: list[
int])-
>
float
: m, n =
len(nums1)
,len
(nums2)
#奇數時候,mid是中間值索引,偶數是後乙個,所以需要pre
mid =
(m+n)//2
# 新增哨兵,減少判斷次數
float
('inf'))
float
('inf'))
i, j =0,
0 pre = res =
0for k in
range
(mid+1)
: pre = res
if nums1[i]
<= nums2[j]
: res = nums1[i]
i +=
1else
: res = nums2[j]
j +=
1#恢復原樣
nums1.pop(
) nums2.pop(
)return res if
(m+n)%2
==1else
(res+pre)
/2
時間複雜度有log基本就是二分了。
leetcode上有多種解法,每次去掉k/2數字(k是中值位置)和將兩個陣列轉換成乙個陣列二分。
每次去掉k/2邊界條件令人頭疼,知道流程我也寫半天(也可能是我太菜了,寫不出好看的表示式),可以參考這裡。
這裡記錄轉換的思路,非常巧妙。參考leetcode median of two sorted arrays 在兩個已排列的陣列中找出中位數。時間複雜度為o(log(min(n,m))。
已知k為中值的位置,那麼假設在a陣列取前a個, 在b陣列中取的個數就被相應確定為k-a;所以問題被轉換為,查詢a陣列中a位置。
a中有m個數字,索引為0,m-1。將當前索引劃分給右側,可選的劃分位置為0…m。
如果左邊序列的最大值小於等於右邊序列的最小值那麼這就是我們要找的劃分。
class
solution}}
};
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,...