<4>—— Median of Two Sorted Arrays

4、 Median of Two Sorted Arrays

两个排序数组的中位数

两个排序的数组A和B分别含有m和n个数,找到两个排序数组的中位数,要求时间复杂度应为O(log (m+n))。

样例

给出数组A = [1,2,3,4,5,6] B = [2,3,4,5],中位数3.5

给出数组A = [1,2,3] B = [4,5],中位数 3

挑战 

时间复杂度为O(log n)

具体思路:

求第k个元素,取A[k / 2] B[k / 2] 比较,如果 A[k / 2] > B[k / 2] 那么,所求的元素必然不在B的前k / 2个元素中,

反之,必然不在A的前k / 2个元素中,于是我们可以将A或B数列的前k / 2元素删去,然后使用递归,直到找到k为止。


代码:

class Solution {
public:
    double findkth(vector<int>& A,vector<int>& B,int A_start,int B_start,int median)
    {
        //边界情况,当一边为空时,直接从另一边取元素
        if(A_start>=A.size())
            return B[B_start+median-1];
        if(B_start>=B.size())
            return A[A_start+median-1];
        //当k为1时,直接取最小值
        if(median==1)return min(A[A_start],B[B_start]);
        //A,B都向前走中位数的一半,相互比较,小的一方说明必然不包含所求的元素
        int A_key=A_start+median/2-1>=A.size()?INT_MAX:A[A_start+median/2-1];
        int B_key=B_start+median/2-1>=B.size()?INT_MAX:B[B_start+median/2-1];
        if(A_key<B_key)//比较,小的一方向前移动,median也减去相应的数量
            return findkth(A,B,A_start+median/2,B_start,median-median/2);
        else
            return findkth(A,B,A_start,B_start+median/2,median-median/2);
    }
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        int sum=nums1.size()+nums2.size();
        double reulst;
        if(sum&1)//sum是否为2的倍数,是有两个中位数
            return reulst=findkth(nums1,nums2,0,0,sum/2+1);
        else
            return reulst=(findkth(nums1,nums2,0,0,sum/2)+findkth(nums1,nums2,0,0,sum/2+1))/2;
    }
};





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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值