50道演算法題(2 50)

2021-09-26 13:58:30 字數 1367 閱讀 5093

給定兩個大小為 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 輸入 輸...