两个有序数组的中位数Median of Two Sorted Arrays(很重要)

https://leetcode.com/problems/median-of-two-sorted-arrays/


对于一个长度为n的已排序数列a,若n为奇数,中位数为a[n / 2 + 1] , 
    若n为偶数,则中位数(a[n / 2] + a[n / 2 + 1]) / 2
    如果我们可以在两个数列中求出第K小的元素,便可以解决该问题
    不妨设数列A元素个数为n,数列B元素个数为m,各自升序排序,求第k小元素
    取A[k / 2] B[k / 2] 比较,
    如果 A[k / 2] > B[k / 2] 那么,所求的元素必然不在B的前k / 2个元素中(证明反证法)
    反之,必然不在A的前k / 2个元素中,于是我们可以将A或B数列的前k / 2元素删去,求剩下两个数列的
    k - k / 2小元素,于是得到了数据规模变小的同类问题,递归解决
    如果 k / 2 大于某数列个数,所求元素必然不在另一数列的前k / 2个元素中,同上操作就好。
class Solution {
public:
    double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
        // write your code here
        int len1=nums1.size();
        int len2=nums2.size();
        int len=len1+len2;
        if(len & 1){
            return findKth(nums1,0,nums2,0,len/2+1);
        }
        return (findKth(nums1,0,nums2,0,len/2)+findKth(nums1,0,nums2,0,len/2+1))/2;
    }

    double findKth(vector<int>& nums1,int i1,vector<int>& nums2,int i2,int k){
        if(i1>=nums1.size()){
            return nums2[i2+k-1];
        }
        if(i2>=nums2.size()){
            return nums1[i1+k-1];
        }
        if(k==1){
            return min(nums1[i1],nums2[i2]);
        }

        int key1=i1+k/2-1>=nums1.size()?INT_MAX:nums1[i1+k/2-1];
        int key2=i2+k/2-1>=nums2.size()?INT_MAX:nums2[i2+k/2-1];
        if(key1<key2){
            return findKth(nums1,i1+k/2,nums2,i2,k-k/2);
        }else{
            return findKth(nums1,i1,nums2,i2+k/2,k-k/2);
        }
    }

};

参考http://www.jiuzhang.com/solutions/median-of-two-sorted-arrays/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值