找两个排好序的数组的中位数

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;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值