尋找兩個正序陣列的中位數
給定兩個大小為 m 和 n 的正序(從小到大)陣列 nums1 和 nums2。
請你找出這兩個正序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。
你可以假設 nums1 和 nums2 不會同時為空。
示例 1:
nums1 = [1, 3]
nums2 = [2]
則中位數是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
則中位數是 (2 + 3)/2 = 2.5
今天是詭異的一道困難題,為什麼說詭異呢?一會就知道啦。拿到題目,兩個有序陣列嗎,尋找兩個陣列中的中位數,ok,把兩個陣列連成乙個陣列再找嘛,merge一下兩個陣列就出來了唄。但是題目要求時間複雜度為o(log(m+n)),按道理歸併是沒辦法滿足的。詭異的事情來了,抱著先解出題目的想法,先歸併了一下,過了。。。什麼鬼,說好的時間複雜度要求呢?哈哈哈
class
solution
else
if(j>=len2)
else
if(nums1[i]
)else
if(nums1[i]
>=nums2[j])}
if((len1+len2)%2
)else
return res;}}
;
ok,系統給過歸給過,還是要看一看更優秀的解法。降低時間複雜度到log級別,等同於每一次迭代的操作都要減半,經典二分查詢就來啦。尋找兩個陣列的中位數,設中位數排序在第k位,則即尋找兩個陣列中第k大的元素。利用二分查詢的思路,設兩個陣列為a,b,官方給出題解如下,取a[k/2-1],b[k/2-1](為方便分別記為ak,bk)進行比較,兩者前面分別有a[0…k/2-2], b[0…k/2-2],共計k-1個元素。
if ak>bk
bk前方的元素必然比ak小,但ak前方可能存在比bk大的數,因此bk最大可能也只可能是第k-1個數。排除bk前方所有數。
if ak<=bk
類似,ak最多可能是k-1個數。排除ak前方所有數。
排除之後呢?個人覺得這裡有一點點難理解,當然,因為我菜,各位大佬肯定能很快看出來。不,各位肯定能自己想出來,不用像我這樣自己再理思路。實際上經過一次比較後,我們排出了k/2個元素,因此,接下去我們要尋找的目標值是剩餘陣列中的第(k-k/2)個元素,所以要更新k值,同時變更ak,bk。注意,在編碼時,我們還要處理一些邊界情況。當第乙個陣列越界時,說明第k個必然不在a中,剩餘陣列都是b的元素,則第k個就是當前b的子陣列的第k個,反之同理。當k==1,是選取a和b中當前的最小值即可。
class
solution
else}}
double
findmediansortedarrays
(vector<
int>
& nums1, vector<
int>
& nums2)
};
leetcode 尋找兩個正序陣列的中位數
給定兩個大小為 m 和 n 的正序 從小到大 陣列 nums1 和 nums2。請你找出這兩個正序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。首先假設兩個陣列大小分別為n和m,如果 n m 為奇數的話我們需要找到第 n m 1...
LeetCode004 尋找兩個正序陣列的中位數
給定兩個大小為 m 和 n 的正序 從小到大 陣列nums1和nums2。請你找出並返回這兩個正序陣列的中位數。輸入 nums1 1,3 nums2 2 輸出 2.00000解釋 合併陣列 1,2,3 中位數 2輸入 nums1 1,2 nums2 3,4 輸出 2.50000 解釋 合併陣列 1,...
leetcode每日一練 尋找兩個正序陣列的中位數
leetcode每日一練 尋找兩個正序陣列的中位數 給定兩個大小為 m 和 n 的正序 從小到大 陣列 nums1 和 nums2。請你找出這兩個正序陣列的中位數。例 1 nums1 1,2 nums2 3 則中位數是 2.0 示例 2 nums1 1,2,3 nums2 4,5,6 則中位數是 3...