給定兩個大小為 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
先是簡單的使用vector中的插入,排序函式來過一遍
class solution
};
結果如下
顯然時間複雜度達不到要求
後來想了比較長的時間,想到了幾個方法,但都難以實現。
於是檢視了一下官網上的例子。
官網鏈結
總結例子:
運用中位數的定義「將乙個集合劃分為兩個長度相等的子集,其中乙個子集中的元素總是大於另乙個子集中的元素」
設計兩個陣列,左邊存放兩陣列中較小數,右邊存放較大數。當左右兩陣列長度相等時,
如果我們可以確認:
len(left_part)=len(right_part)
max(left_part)≤min(right_part)
那麼,我們就找到了中位數
**median=[max(left_part)+min(right_part)]/2**
下為具體例項
class solution
int imin = 0, imax = m, halflen = (m + n + 1) / 2;
while (imin <= imax)
else if (i > imin && a[i-1] > b[j])
else
else if (j == 0)
else
if ( (m + n) % 2 == 1 )
int minright = 0;
if (i == m)
else if (j == n)
else
return (maxleft + minright) / 2.0;}}
return 0.0;}}
50道演算法題(1 50)
題目 給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 ...
50道演算法題(5 50)
請你來實現乙個 atoi 函式,使其能將字串轉換成整數。首先,該函式會根據需要丟棄無用的開頭空格字元,直到尋找到第乙個非空格的字元為止。當我們尋找到的第乙個非空字元為正或者負號時,則將該符號與之後面盡可能多的連續數字組合起來,作為該整數的正負號 假如第乙個非空字元是數字,則直接將其與之後連續的數字字...
50道演算法題(11 50)
給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true 示例 2 輸入 輸出 true 示例 3 輸入 輸出 false 示例 4 輸入 輸出 false 示例 5 輸入 輸...