令人頭禿的困難題僅寫我的部分理解,詳見學習題解鏈結。
1、變數解釋lmax
:切割點左側最大元素
rmin
:切割點右側最小元素
cut
:中位數的切割點eg:
[1,2,3] lmax=rmin=2
[1,2] lmax=1 rmin=2
2、中位數中位數切點滿足的條件有:(lmax1<=rmin2)&&(lmax2<=rmin1)&&(cut1+cut2==len1+len2)
其中
cut1+cut2==len1+len2
(最終的切點下標是len1+len2,實際對應位置是len1+len2+1),因為虛擬加後的陣列長度和為2len1+2len2+2
。結果為
result=(max(lmax1,lmax2)+min(rmin1,rmin2))/2.0
3、虛擬陣列由於求中位數存在奇數偶數的問題,我們虛擬的在數字之間加上乙個#
.
2n+1
永遠都是奇數,eg:1 2 3
變成#1#2#3#
這樣就可以保證下式成立
lmaxi = (ci-1)/2 位置上的元素
rmini = ci/2 位置上的元素
在實際的計算中,沒有人真的在數字之間加入
#
,只是在計算時先乘以2,按照下標取數時再除以2.
4、如果乙個陣列完全小於等於另乙個?c1 = 0
—— 陣列1整體都在右邊了,所以都比中值大,中值在陣列2中,簡單的說就是陣列1割後的左邊是空了,所以我們可以假定lmax1 = int_min
c1 =2*len1
—— 陣列1整體都在左邊了,陣列1割後的右邊是空了,中值在陣列2中,在陣列1中你找不到元素能滿足(lmax2<=rmin1)
,所以我們可以假定rmin1= int_max。
c2 = 0
—— 陣列2整體在右邊了,陣列2割後的左邊是空了,所以我們可以假定lmax2 = int_min.
c2 = 2*len2
—— 陣列2整體在左邊了,陣列2割後的右邊是空了,為了讓lmax1 < rmin2 恆成立,我們可以假定rmin2 =int_max,事實上,僅當len1=len2
時可能觸發這種結果。
#define debug(x) cout< (b)) ? (a) : (b))
#define min(a,b) (((a) < (b)) ? (a) : (b))
class
solution
int lmax1,lmax2,rmin1,rmin2,cut1,cut2,lf=
0,rt=
2*len1;
while
(lf<=rt)
return
(max
(lmax1,lmax2)
+min
(rmin1,rmin2))/
2.0;}}
;
leetcode04 尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...
leetcode 04 尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0 示例 2 nums1 1,2 ...
LeetCode 04尋找兩個有序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設nums1和nums2不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 2.0示例 2 nums1 1,2 nums2...