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)).
You may assume nums1 and nums2 cannot be both empty.
Example 1:
nums1 = [1, 3] nums2 = [2] The median is 2.0
/* 在两个排序的数组中找到中位数
* 方法1 合并后找 O(n)
* lenA = n, lenB= m, m>=n
* 方法2 在[Aleft, Bleft] [Aright, Bright] 找到i,j合理划分使得左边元素个数等于右边元素个数
* 即i+j = n-i+m-j+1 1可加可不加 j=(n+m+1)/2-i
*
* 即i向右移动增大Aleft时 j必然向左移动减小Bright(想象i和j联动移动 移动方向相反) 因此可用二分查找定位i
* 在保证left 等于或者比right多一个元素的条件下 m+n如果为奇数 mid=max(A[i-1], B[j-1])
* m+n 如果为偶数 mid=(max(A[i-1],b[j], min(A[i-1], B[j])))/2
* 边界条件:i=0或者 i=n
*
* i表示切割位置 即A[0:i]左闭右开
* x x x x | x x
* 0 1 2 3 4
* */
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
if(nums1.size()>nums2.size()) return findMedianSortedArrays(nums2, nums1);
int n=nums1.size(), m=nums2.size();
int imin=0, imax=n, i, j;
while(imin<=imax){
i = (imin+imax)/2;
j = (n+m+1)/2-i;
// i要增大 即minBleft比maxAright大
if(j!=0 && i!=n && nums2[j-1]>nums1[i])
imin = i+1;
else if(i!=0 && j!=m && nums1[i-1]>nums2[j])
imax = i-1;
else{
// 注意边界条件(其实就是数组越界的位置)A[i-1] B[j-1] 就是i==0 j==0 就是边界位置
int maxLeft;
if(i==0) maxLeft = nums2[j-1];
else if(j==0) maxLeft = nums1[i-1];
else maxLeft = max(nums1[i-1], nums2[j-1]);
if((n+m)%2==1) return maxLeft;
int minRight;
if(i==n) minRight = nums2[j];
else if(j==m) minRight = nums1[i];
else minRight = min(nums1[i], nums2[j]);
return (double)(minRight+maxLeft)/2;
}
}
return 0.0;
}
};