4.兩個排序陣列的中位數
給定兩個大小為 m 和 n 的有序陣列
nums1
和 nums2
。請找出這兩個有序陣列的中位數。要求演算法的時間複雜度為 o(log (m+n)) 。
示例 1:
nums1 = [1, 3]示例 2:nums2 = [2]
中位數是 2.0
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 是 子串行...