4. 寻找两个正序数组的中位数

要求:O(log(m+n))
思路:分割线将两个数组划分,奇数时左边多一个,因此左边个数是(m+n+1)/2=k,分隔线右边元素下标i+j=k
在小数组二分否则k-i越界
满足交叉小于等于,二分查找使得a[i]>=b[j-1],那么如何使的a[i-1]<=b[j]?答案是j右移i左移,即我们只需要在a[i]>=b[j-1]时左移i即可
最后看注释,边界简单

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int m=nums1.size(),n=nums2.size();
        if(m>n)return findMedianSortedArrays(nums2,nums1);
        int k=(m+n+1)/2;
        int left=0,right=m-1;
        while(left<=right){
            int i=(left+right)/2;
            int j=k-i;
            if(nums1[i]>=nums2[j-1])right=i-1;
            else left=i+1;
        }
        //right是第一个数组分隔线左边,第二个数组分割线左边是k-i-2
        int l1=right,l2=k-l1-2,r1=l1+1,r2=l2+1;
        int mid1;
        if(l1==-1)mid1=nums2[l2];
        else if(l2==-1)mid1=nums1[l1];
        else mid1=max(nums1[l1],nums2[l2]);
        if((m+n)&1)return mid1;
        int mid2;
        if(r1==m)mid2=nums2[r2];
        else if(r2==n)mid2=nums1[r1];
        else mid2=min(nums1[r1],nums2[r2]);
        return (mid2+mid1)/2.0;
    }
};

你可能感兴趣的:(数学,leetcode,算法)