Leetcode 4. Median of Two Sorted Arrays(二分)

4. Median of Two Sorted Arrays

题目链接:https://leetcode.com/problems/median-of-two-sorted-arrays/

Description:

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

题意:

给出两个数组nums1,nums2,数组里面的数都是单增的,要求在log(n+m)的时间内,找出两个数组合并后的中位数。

题解:

最近看了看leetcode的题,感觉还是挺有意思的。

这个题就要充分利用中位数的性质来解,中位数,我们首先最容易想到的就是中间位置的数。

其实还有的性质就是:中位数将数列划分为左右两边数量相等且max(left)<=min(right)。

对于长度为偶数,那么左右两边数量可以相等,对于奇数,那么我们这里假定左边的数量比右边大于1。

根据数组单调的这一特征,我们可以二分来划分数组,二分数组nums1在左边的个数i,那么nums2在左边的个数就可以算出来为(n+m+1)/2-i。

最后判断一下nums1[i-1]和nums2[j]以及nums1[j-1]和nums2[i]就ok了。

这里注意一下边界情况:即i=0,i=n,j=0,j=m时的情况,由于我们的算法,i=0,j=0不会同时出现,i=n,j=m也不会同时出现,所以左边部分和右边部分至少有一个数组。最后判断一下就好了。

建议自己去实现代码~还是有细节的。

代码如下:

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int n=nums1.size(),m=nums2.size();
        if(n>m) swap(nums1,nums2),swap(n,m);
        int l=0,r=n+1;
        while(l<r){
            int i = l+r>>1;//0~i-1
            int j = (n+m+1>>1)-i;//0~j-1
            if(j<m && i>=1 && nums1[i-1]>nums2[j]) r=i;
            else if(i<n && j>=1 && nums2[j-1]>nums1[i]) l=i+1;
            else{
                int max_left,min_right;
                if(i==0) max_left = nums2[j-1];
                else if(j==0) max_left = nums1[i-1];
                else max_left=max(nums1[i-1],nums2[j-1]);
                if(n+m&1) return max_left;
                if(i==n) min_right = nums2[j];
                else if(j==m) min_right = nums1[i];
                else min_right = min(nums1[i],nums2[j]);
                return (max_left+min_right)/2.0;
            }
        }
        return 0;
    }
};
View Code
原文地址:https://www.cnblogs.com/heyuhhh/p/10226078.html