【LeetCode】尋找兩個(gè)已排序數(shù)組中的中位數(shù)

原題鏈接:https://leetcode.com/problems/median-of-two-sorted-arrays/description/

兩個(gè)已排序數(shù)組A[m]和B[n],找到它們兩個(gè)的中位數(shù)。
例子:
[1,3],[2] -> result = 3
[1,3], [2,4] -> result = (2+3)/2 = 2.5
核心要求是算法復(fù)雜度為O(log (m+n))

(以下僅為自己的思路記錄,還未編碼進(jìn)行驗(yàn)證)
解法思路:
由于復(fù)雜度要求為O(log (m+n)),因此考慮用二分的思路進(jìn)行求解。
假設(shè)A和B合并后的中位數(shù)為x(若有兩個(gè)則為x,y),那么比x(x、y)小的數(shù)共有(m+n-1)/2 (向下取整)個(gè),記為k個(gè),同樣比x(或者x和y)大的數(shù)也有k個(gè)。
那么我們可以把思路調(diào)整為,不斷二分篩掉這些明顯較小和較大的數(shù),最后剩下的就是我們要找的中位數(shù):
第一步,取A的第k/2個(gè)數(shù)A[k/2 -1]和B倒數(shù)第k/2個(gè)數(shù)B[n- k/2],這樣可以找出比A[k/2 -1]和B[n- k/2]都小和都大的數(shù),并丟棄。不妨設(shè) A[k/2 -1] < B[n-k/2],那么A[0]~A[k/2 -1]就是可以篩掉的較小的數(shù),B[n-k/2] ~B[n]就是可以篩掉的較大的數(shù)。
第二步,這個(gè)時(shí)候未被篩掉的較小和較大的數(shù)都還有k/2個(gè),那么我們繼續(xù)進(jìn)行二分,取篩選后的A、B數(shù)組繼續(xù)取其第k/4和倒數(shù)k/4的數(shù),比較后篩選掉,如此循環(huán)。

終止條件:若本次迭代需要篩選掉t個(gè)數(shù),而某個(gè)被篩選后的數(shù)組已經(jīng)不足t/2個(gè)數(shù),那么取該數(shù)組的末端數(shù)字與另一數(shù)組應(yīng)該取到的數(shù)字進(jìn)行比較,之后就很容易可以得到中位數(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容