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

 

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        if(nums1.size() > nums2.size())
            swap(nums1, nums2);
        int len1 = nums1.size();
        int len2 = nums2.size();
        int half = (len1+len2+1)>>1;
        int left=0, right=len1;
        while(left <= right){
            int mid = left + ((right-left)>>1);
            int cut = half - mid;
            if(mid>0 && nums1[mid-1]>nums2[cut])
                right = mid-1;
            else if(mid<right && nums2[cut-1]>nums1[mid])
                left = mid+1;
            else{
                int left_max = 0;
                if(mid>0 && cut>0)
                    left_max = max(nums1[mid-1], nums2[cut-1]);
                else if(mid == 0)
                    left_max = nums2[cut-1];
                else
                    left_max = nums1[mid-1];
                if((len1+len2)%2 == 1)
                    return left_max;
                int right_min = 0;
                if(mid<len1 && cut<len2)
                    right_min = min(nums1[mid], nums2[cut]);
                else if(mid == len1)
                    right_min = nums2[cut];
                else
                    right_min = nums1[mid];
                return (left_max+right_min)/2.0;
            }
        }
        return 0.0;
    }
};

 将较短的数组存在nums1中,然后对nums1使用二分做切分,通过一个固定变量half来找到当前nums1的切分情况下,对应的nums2的切分点,这样能保证将整个数组等分为两部分。这里,nums1切分为左右两部分,nums2切分为左右两部分。总的切分是左+左,右+右,且如果两个数组的元素数量和为奇数,则左半侧多1个数。每次切分,判定左侧两个最大元素和右侧两个最小元素的大小关系,切分停止的标准是左侧所有元素均小于右侧,然后开始找中位数。

切分后:

nums1[0] ----- nums1[mid-1]                          nums1[mid] ----- nums1[len1-1]

nums2[0] ----- nums2[cut-1]                           nums2[cut]  -----  nums2[len2-1]

找中位数的过程中,奇数组则返回left_max,偶数组返回(left_max+right_min)/2.0

需要注意各种边界条件,相当容易错

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值