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
下面這個連結講得很好了。
https://leetcode.com/problems/median-of-two-sorted-arrays/discuss/2481/Share-my-O(log(min(m,n))-solution-with-explanation
著重介紹一下怎麼處理邊界:
1、需要滿足條件:B[j-1] <= A[i] and A[i-1] <= B[j]
2、某些邊界情況下,i=0/i=m/j=0/j=n,有些不存在了。這個時候只需要滿足存在的即可
3、所以需要滿足條件: (j == 0 or i == m or B[j-1] <= A[i]) and (i == 0 or j == n or A[i-1] <= B[j])
兩兩組合一共九種情況,排除掉一些不可能的情況,
如 (j == 0 or i == m or B[j-1] <= A[i]) and (i == 0 or j == n or A[i-1] <= B[j])
這個時候只剩下5中情況,程式碼中會有註釋。
i == 0 && B[j-1]<=A[i]
j == n && B[j-1]<=A[i]
j == 0 && A[i-1]<=B[j]
i == m && A[i-1]<=B[j]
B[j-1] <= A[i] and A[i-1] <= B[j]
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
double find_median(vector<int>& A, vector<int>& B) {
//初始化,處理邊界
int m = A.size(), n = B.size(), p, q, l, r;
if (A.empty() && B.empty()) return 0;
if (A.empty()) return n % 2 == 1 ? B[n/2]: (B[n/2-1]+B[n/2])/2.0;
if (B.empty()) return m % 2 == 1 ? A[m / 2] : (A[m / 2 - 1] + A[m / 2]) / 2.0;
//選取較短的陣列s來做二分。
if (m > n)
{
swap(A,B);
m = B.size();
n = A.size();
}
l = 0,r = m;
while (l <= r)
{
p = l + (r - l) / 2;
q = (m + n + 1) / 2 - p;
if (p<m && (s[p] < ss[q - 1])) //p右移
l = p + 1;
else if (p>0 && s[p - 1] > ss[q])//p左移
r = p - 1;
else //找到p
{
if (p == 0)
{
if (m == n)
return (s[p] + ss[q - 1]) / 2.0;
else
return (m + n) % 2 == 1 ? ss[q - 1] : (min(s[p], ss[q]) + ss[q - 1]) / 2.0;
}
if (p == m)
return (m + n) % 2 == 1 ? max(s[p - 1], ss[q - 1]) : (max(s[p - 1], ss[q - 1]) + ss[q])/ 2.0;
if (q == 0)
return (s[p - 1] + s[q]) / 2.0;
if (q == n)
return (m + n) % 2 == 1 ? ss[q - 1] : (s[p] + ss[q - 1]) / 2.0;
else
break;
}
}
return (m + n) % 2 == 1 ? max(s[p - 1], ss[q - 1]) : (max(s[p - 1], ss[q - 1]) + min(s[p], ss[q])) / 2.0;
}
int main()
{
vector<int> A = {3};
vector<int> B = { 1,2,4};
vector<int> C = { 1 };
vector<int> D = { 2, 3 };
double re1 = 0, re2 = 0;
re1 = find_median(A, B);
//re2 = find_median(C, D);
cout << "re1=" << re1 << endl; //5.5
//cout << "re2=" << re2 << endl; //5
return 0;
}
相關文章
- LeetCode 4. 兩個排序陣列的中位數LeetCode排序陣列
- LeetCode-兩個排序陣列的中位數LeetCode排序陣列
- 4. 尋找兩個正序陣列的中位數陣列
- 演算法-兩個排序陣列的中位數演算法排序陣列
- LeetCode-4. 兩個排序陣列的中位數LeetCode排序陣列
- [LeetCode 刷題] 4. 尋找兩個有序陣列的中位數 (Hard)LeetCode陣列
- 【LeetCode Hot 100】4. 尋找兩個正序陣列的中位數LeetCode陣列
- 兩個有序陣列的中位數陣列
- LeetCode解題(C++)-4. 尋找兩個有序陣列的中位數LeetCodeC++陣列
- 尋找兩個有序陣列的中位數陣列
- 尋找兩個正序陣列中的中位數陣列
- leetcode 4. Median of Two Sorted Arrays 尋找兩個正序陣列的中位數(困難)LeetCode陣列
- 從0打卡leetcode之day 5 ---兩個排序陣列的中位數LeetCode排序陣列
- [Python手撕]兩個升序陣列的中位數Python陣列
- 每天一道演算法題:求兩個排序陣列的中位數演算法排序陣列
- 【遞迴打卡1】在兩個長度相等的排序陣列中找到上中位數遞迴排序陣列
- LeetCode--尋找兩個有序陣列的中位數(05)LeetCode陣列
- LeetCode第4題:尋找兩個有序陣列的中位數LeetCode陣列
- GO實現:leetcode之尋找兩個正序陣列的中位數GoLeetCode陣列
- 尋找兩個正序陣列的中位數問題,方法一:合併陣列檢索法陣列
- 力扣演算法題:尋找兩個正序陣列的中位數力扣演算法陣列
- 二位陣列排序陣列排序
- PHP陣列多個欄位分別排序PHP陣列排序
- 4.陣列陣列
- 二維陣列根據某個欄位排序陣列排序
- 找到兩個陣列中的公共元素陣列
- python實現給定一個數和陣列,求陣列中兩數之和為給定的數Python陣列
- PHP 二維陣列, 按某一個欄位排序PHP陣列排序
- 給定陣列中找到最大的兩個數陣列
- Javascript中的陣列物件排序JavaScript陣列物件排序
- 陣列中每個陣列元素出現的次數陣列
- 尋找陣列中和為定值的兩個數陣列
- 陣列的排序陣列排序
- 給定兩個大小為 m 和 n 的正序(從小到大)陣列 nums1 和 nums2。請你找出並返回這兩個正序陣列的中位數。陣列
- 1122. 陣列的相對排序(計數排序 / 自定義排序)陣列排序
- 用 PHP 在 力扣 刷演算法 [尋找兩個正序陣列的中位數]{有空就更}PHP力扣演算法陣列
- 比較兩個陣列中是否有相同的元素陣列
- 求陣列中是否存在滿足特定和的兩個數字(python & Js)陣列PythonJS