题目:给定两个大小为m和n的有序数组num1和num2。在时间复杂度为O(log(m+n))找到该数。
两个思想:(1)二分查找;
(2)插入虚拟符号,让所有数组变成奇数;
中位数计算的条件:L1<R2 && L2<R1
中位数的值为:Value = (max(L1,L2) +min(R1,R2))/2;
还有两种边界情况:c1==0 (L1=INT_MIN);c1==2*n (R1=INT_MAX);
double findMedianSortedArrays(vector<int> &nums1, vector<int> &nums2)
{
int n = nums1.size();
int m = nums2.size();
if(n<=m){
int L1,L2,R1,R2,c1,c2,lo=0,hi = 2*n;
while(lo<=hi){
c1 = (lo+hi)/2;
c2 = m+n-c1;
L1 = (c1 == 0)?INT_MIN:nums1[(c1-1)/2];
R1 = (c1==2*n)?INT_MAX:nums1[c1/2];
L2 = (c2==0)?INT_MIN:nums2[(c2-1)/2];
R2 = (c2==2*m)?INT_MAX:nums2[c2/2];
if(L1>R2)
hi = c1-1;
else if(L2>R1)
lo = c1+1;
else
break;
}
return (max(L1,L2)+min(R1,R2))/2.0;
}
else
return findMedianSortedArrays(nums2,nums1);
}