leetcode上遇到的一道題,感覺很有意思
因為要求o(log(m+n)),所以第一反應時用二分來找,但是該怎麼用二分呢?
陣列a,b分別有序,我們可以先找到陣列a中的一條分界線i,使得陣列a分為a_left,和a_right兩部分,那麼因為時要找到中位數,我們可以直接計算出b陣列的一條分界線j,使得size(aleft)+size(bleft)=size(aright)+size(bright),但此時還沒有結束,因為還要滿足max(aleft,bleft) j=(n+m+1)/2-i m>=n。。。因為如果n>m的話j有可能小於0
a[i-1]b[j-1]對於i,j=0和i=n,j=m的邊界條件需要特殊處理一下,也比較簡單
比如當i=0,或者j=m時,我們不需要檢查a[i-1]b[j-1]
i>0,m>=n ->j=(n+m+1)/2-i
i=n ->j=(n+m+1)/2-i>=(2n+1)/2-i>(2n+1)/2-n==0
這樣迴圈的處理就簡單了
1.當 i>0 and a[i-1]>b[j] -> i太大了
2.當 ii太小了
3.否則i位置合適
**如下:
class solution
else
}return -1;}};
求兩個有序陣列的中位數
要求 給定兩個大小為 m 和 n 的有序陣列 nums1 和 nums2。請你找出這兩個有序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 例如 nums1 1,3 nums2 2 則中位數是 2.0 nums1 1,2 nums2 3,4 則中位數是 2 3 2 2.5 演算法解析...
求兩個有序陣列的中位數
原部落格 設陣列a的長度為m,陣列b的長度為n,兩個陣列都都是遞增有序的。求這兩個陣列的中位數 首先我們看看中位數的特點,乙個大小為n的陣列,如果n是奇數,則中位數只有乙個,陣列中恰好有 n 1 2 個元素比中位數小。如果n是偶數,則中位數有兩個 下中位數和上中位數 這裡我們只求下中位數,對於下中位...
兩個有序陣列中位數
大小m和n分別有兩個排序陣列a和b。找到兩個排序陣列的中值。總的執行時間複雜度應該是o log m n class solution return findkth a,b,0,0,m,n,s 2 findkth a,b,0,0,m,n,s 2 1 2 private double findkth v...