4. 尋找兩個正序陣列的中位數
給定兩個大小為 m 和 n 的正序(從小到大)陣列nums1
和nums2
。
請你找出這兩個正序陣列的中位數,並且要求演算法的時間複雜度為 o(log(m + n))。
你可以假設nums1
和nums2
不會同時為空。
示例 1:
nums1 = [1, 3]示例 2:nums2 = [2]
則中位數是 2.0
nums1 = [1, 2]首先想到的演算法是乙個i掃瞄nums1, 乙個j掃瞄nums2, 兩面總共掃瞄(m + n)/ 2次就好nums2 = [3, 4]
則中位數是 (2 + 3)/2 = 2.5
但那個演算法複雜度是 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,...