leetcode day01 兩個排序陣列的中位數

2021-08-19 20:19:14 字數 1442 閱讀 1025

4.兩個排序陣列的中位數

給定兩個大小為 m 和 n 的有序陣列 

nums1 

和 nums2 

。請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 o(log (m+n)) 。

示例 1:

nums1 = [1, 3]

nums2 = [2]

中位數是 2.0

示例 2:

nums1 = [1, 2]

nums2 = [3, 4]

中位數是 (2 + 3)/2 = 2.5

解決方法1:

這個方法其實是不符合時間複雜度的方法,但也是我們最常想起來的方法。

**:

//歸併排序

class solution

if (nums2.empty()) else

}if (i < m) else if (j < n)

int len = ans.size();

if (len%2 != 0)

return 1.0*ans[len/2];

return (ans[len/2]+ans[len/2-1])/2.0;}};

解決方法2:

為了滿足題目對時間複雜度的要求,我們這兒可以採用二分查詢法。逐步排除掉不可能出現中位數的區間,最後找到所求的中位數。這種解法的主要思想就是: 

如果陣列a的中位數小於陣列b的中位數,那麼整體的中位數只可能出現在a的右區間加上b的左區間之中; 

如果陣列a的中位數大於等於陣列b的中位數,那麼整體的中位數只可能出現在a的左區間加上b的右區間之中。 

關鍵就是利用分治的思想逐漸縮小a的區間和b的區間來找到中位數。

**:

//二分查詢

class solution

if (nums2.empty())

/* 如果m+n為偶數的時候,即中位數是中間兩個的平均數,total和total2分別表示這兩個數 

* 如果m+n為奇數的時候,即中位數是中間那個數,total和total2相等,均表示中間那個數 

*/ int total = (m+n+1)/2;

int total2 = (m+n+2)/2;

return (find_kth(nums1,0,nums2,0,total)+find_kth(nums1,0,nums2,0,total2))/2.0;

}//這個函式就是用於尋找兩個陣列合併之後第k位的數(下標為k-1) 

double find_kth(vectora, int a_begin, vectorb, int b_begin, int k)

};

leetcode day01 兩數相加

2.兩數相加 給定兩個非空鍊錶來表示兩個非負整數。位數按照逆序方式儲存,它們的每個節點只儲存單個數字。將兩數相加返回乙個新的鍊錶。你可以假設除了數字 0 之外,這兩個數字都不會以零開頭。示例 輸入 2 4 3 5 6 4 輸出 7 0 8 原因 342 465 807注意點 1.c 中的結構體在定義...

leetcode day01 有效的括號

題目如下 給定乙個只包括 的字串,判斷字串是否有效。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。示例 1 輸入 輸出 true示例 2 輸入 輸出 true示例 3 輸入 輸出 false示例 4 輸入 輸出 false示例 5 輸入 ...

leetcode day01 無重複字元的最長子串

3.無重複字元的最長子串 給定乙個字串,找出不含有重複字元的最長子串的長度。示例 給定 abcabcbb 沒有重複字元的最長子串是 abc 那麼長度就是3。給定 bbbbb 最長的子串就是 b 長度是1。給定 pwwkew 最長子串是 wke 長度是3。請注意答案必須是乙個子串,pwke 是 子串行...