//方法一:合并,然后计算中值
//不过时间复杂度为O(m+n),不满足题意
class Solution
{
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2)
{
int i=0,j=0,k=0;
int m = nums1.size();
int n = nums2.size();
int len = m+n;
vector<int> temp(len);
while(i<m&&j<n) //合并,耗时O(m+n)
{
temp[k++] = (nums1[i]<nums2[j])? nums1[i++]:nums2[j++];
}
while(i<m)
{
temp[k++] = nums1[i++];
}
while(j<n)
{
temp[k++] = nums2[j++];
}
double mid; //注意这里类型为浮点数,因为可能为小数
if(len&1)
mid = temp[(len-1)/2];//长度为奇数时,中值为中间数
else
mid = (temp[(len-1)/2]+temp[len/2])/2.0;//长度为偶数时,中值为中间两数平均数
return mid;
}
};
//方法二:递归,利用二分查找
//没看懂??
class Solution
{
public:
int getkth(vector<int>& s, int m, vector<int>& l, int n, int k)
{
//让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,, n-j, k-j);
else return getkth(s+i, m-i, l, n, k-i);
return 0;
}
double findMedianSortedArrays(vector<int>& a, vector<int>& b)
{
int m = a.size();
int n = b.size();
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;
}
};