leetcode 5 尋找兩個正序陣列的中位數

2021-10-06 10:26:14 字數 1572 閱讀 2288

4. 尋找兩個正序陣列的中位數

給定兩個大小為 m 和 n 的正序(從小到大)陣列nums1nums2

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

你可以假設nums1nums2不會同時為空。

示例 1:

nums1 = [1, 3]

nums2 = [2]

則中位數是 2.0

示例 2:

nums1 = [1, 2]

nums2 = [3, 4]

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

首先想到的演算法是乙個i掃瞄nums1, 乙個j掃瞄nums2, 兩面總共掃瞄(m + n)/ 2次就好

但那個演算法複雜度是 o(m + n)的

再看題目要求是o(log(m + n)), 一定是二分遞規

這裡我們定義乙個遞迴函式來求兩個陣列的第k個元素

如果k = 1, 那麼肯定是兩個陣列的第乙個數中的較小的那個

其他情況呢

兩個陣列都找第 k / 2 個元素

如果某乙個陣列長度小於 k / 2 , 那第k個元素肯定在另乙個陣列中

比較兩個陣列的第 k / 2 個元素,較小的那個的陣列前 k / 2個元素中是肯定找不到了

然後在他剩下的部分和另乙個陣列中找第k - k / 2 個元素

這樣就二分遞迴找到了兩個陣列的第k個數

還有乙個問題,就是奇數個元素的中位數和偶數個元素的中位數的不同

這裡偷個懶

不管奇數偶數個元素,中位數都等於(第(m + n  + 1)/ 2個元素 + 第(m  + n + 2)/ 2個元素 ) / 2

#include #include #include using namespace std;

double findk(vector& nums1, int i, vector& nums2, int j, int k)

if(j >= nums2.size())

if(k == 1)

else

} int mid1 = int_max;

int mid2 = int_max;

if(i + k/2 - 1 < nums1.size())

if(j + k/2 - 1 < nums2.size())

if(mid1 < mid2)

else

}double findmediansortedarrays(vector& nums1, vector& nums2)

int main();

int n2 = ;

vectornums1(n1, n1 + 2);

vectornums2(n2, n2 + 1);

double re = findmediansortedarrays(nums1, nums2);

cout << re << endl;

return 0;

}

LeetCode 尋找兩個正序陣列的中位數

尋找兩個正序陣列的中位數 給定兩個大小為 m 和 n 的正序 從小到大 陣列 nums1 和 nums2。請你找出這兩個正序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。示例 1 nums1 1,3 nums2 2 則中位數是 ...

leetcode 尋找兩個正序陣列的中位數

給定兩個大小為 m 和 n 的正序 從小到大 陣列 nums1 和 nums2。請你找出這兩個正序陣列的中位數,並且要求演算法的時間複雜度為 o log m n 你可以假設 nums1 和 nums2 不會同時為空。首先假設兩個陣列大小分別為n和m,如果 n m 為奇數的話我們需要找到第 n m 1...

LeetCode004 尋找兩個正序陣列的中位數

給定兩個大小為 m 和 n 的正序 從小到大 陣列nums1和nums2。請你找出並返回這兩個正序陣列的中位數。輸入 nums1 1,3 nums2 2 輸出 2.00000解釋 合併陣列 1,2,3 中位數 2輸入 nums1 1,2 nums2 3,4 輸出 2.50000 解釋 合併陣列 1,...