leetcode 4. Median of Two Sorted Arrays 二分

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
Example 2:

nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

找两个有序数组的中值。用二分法,假设第一个数组元素较少,数量为 mm,二分 i[0,m]i\in[0,m],使得 [0,i1][0,i-1] 为前半部分(i=0i=0 时前半部分为空),令两个数组总共的前半部分长度为 halflen=(n+m+1)/2halflen=\lfloor(n+m+1)/2\rfloor,则对应到第二个数组的 j=halflenij=halflen-i ,即第二个数组中 [0,j1][0,j-1] 是前半部分。应当满足的条件是(假设第一第二个数组分别为 a,ba,b):

a[i1]b[j]b[j1]a[i] \begin{aligned} a[i-1]&\le b[j]\\ b[j-1]&\le a[i] \end{aligned}

假如不符合的话就修改相应的二分边界,复杂度 O(logmin(m,n))O(\log{\min(m,n)})见代码:

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int m=nums1.size(),n=nums2.size();
        if(m>n){swap(m,n);swap(nums1,nums2);}
        int l=0,r=m,hl=(n+m+1)/2,maxl,minr;
        while(l<=r){
            int i=(l+r)/2;
            int j=hl-i;
            if(i>0&&nums1[i-1]>nums2[j])r=i-1;
            else if(i<m&&nums2[j-1]>nums1[i])l=i+1;
            else{
                if(i==0)maxl=nums2[j-1];
                else if(j==0)maxl=nums1[i-1];
                else maxl=max(nums1[i-1],nums2[j-1]);
                if((n+m)%2==1)return maxl;
                if(i==m)minr=nums2[j];
                else if(j==n)minr=nums1[i];
                else minr=min(nums1[i],nums2[j]);
                return double(maxl+minr)/2;
            }
        }
        return 0;
    }
};
posted @ 2020-05-05 11:02  winechord  阅读(84)  评论(0编辑  收藏  举报