题目简介
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).
Simple solution: O(m+n)
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int m = nums1.size();
int n = nums2.size();
int* a = new int[m+n];
int p1=0;
int p2=0;
int end = (m+n)/2+1;
int count=0;
int flag= 0;
double res=0.0;
if((m+n)%2==0){
flag = 1;
}else{
flag = 0;
}
while(p1<m && p2<n){
if(nums1[p1]<=nums2[p2]){
a[count++]=nums1[p1++];
}else{
a[count++]=nums2[p2++];
}
if(count==end){
if(flag){
res = (double(a[count-1])+double(a[count-2]))/2;
}else{
res= double(a[count-1]);
}
return res;
}
}
if(p1==m){
while(p2<n){
a[count++]=nums2[p2++];
}
}
if(p2==n){
while(p1<m){
a[count++]=nums1[p1++];
}
}
if(flag){
res = (double(a[end-1])+double(a[end-2]))/2;
}else{
res = double(a[end-1]);
}
return res;
}
};
二分法:O(log (m+n))
摘自Leetcode
class Solution {
public:
int getkth(int s[], int m, int l[], int n, int k){
// let m <= n
if (m > n)
return getkth(l, n, s, m, k);
if (m == 0)
return l[k - 1];
if (k == 1)
return min(s[0], l[0]);
int i = min(m, k / 2), j = min(n, k / 2);
if (s[i - 1] > l[j - 1])
return getkth(s, m, l + j, n - j, k - j);
else
return getkth(s + i, m - i, l, n, k - i);
return 0;
}
double findMedianSortedArrays(int A[], int m, int B[], int n) {
//Note: 当m+n为奇数,l==r;当m+n为偶数, l+1==r.
int l = (m + n + 1) >> 1;
int r = (m + n + 2) >> 1;
return (getkth(A, m ,B, n, l) + getkth(A, m, B, n, r)) / 2.0;
}
};