4. Median of Two Sorted Arrays

使用二分法(分治思想)来解决这个问题,对于两个长度分别为 m m n 的数组,其时间复杂度为 log(m+n) l o g ( m + n ) 。假设找出其中第 k k 个元素,设在第一个数组中查找 p 个元素,在第二个数组中查找 q q 个元素,那么可得 p+q=k,因此问题变成在一个数组中确定 p p 的值大小的问题。代码实际在做的是一个二分 k 的过程。

class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int length = nums1.size() + nums2.size();
        if(length % 2 == 0){
            return (findKth(nums1, nums2, 0, nums1.size(), 0, nums2.size(), length / 2) +
            findKth(nums1, nums2, 0, nums1.size(), 0, nums2.size(), length / 2 + 1)) / 2.0f;
        }else{
            return findKth(nums1, nums2, 0, nums1.size(), 0, nums2.size(), (length + 1) / 2);
        }
    }

private:
    int findKth(vector<int>& nums1, vector<int>& nums2, int start1, int len1, int start2, int len2, int k){
        //保证第一个数组的元素个数小于第二个数组
        if(len1 > len2){
            return findKth(nums2, nums1, start2, len2, start1, len1, k);
        }
        //第一个数组的元素为0
        if(len1 == 0)
            return nums2[start2 + k - 1];
        //只寻找一个元素时
        if(k==1)
            return min(nums1[start1], nums2[start2]);


        int p = min(k/2, len1);
        int q = k - p;

        if(nums1[start1 + p - 1] > nums2[start2 + q - 1]){
            //说明nums2 中的 q 个元素均在前 k 个元素中
            return findKth(nums1, nums2, start1, len1, start2 + q, len2 - q, k - q);
        }else if(nums1[start1 + p - 1] < nums2[start2 + q - 1]){
            return findKth(nums1, nums2, start1 + p, len1 - p, start2, len2, k - p);
        }else{
            return nums1[start1 + p - 1];
        }
    }
};

思路和代码参考 简书上的一篇文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值