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

2021-10-03 14:46:45 字數 1889 閱讀 3196

令人頭禿的困難題

僅寫我的部分理解,詳見學習題解鏈結。

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...