LeetCode4. Median of Two Sorted Arrays

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)).

意思是在O(log(m+n))中,找出两个已经排好序的数组的中位数。
可以将题目转化为求两个有序数组中第k大的元素,现在要找中位数,如果m+n是奇数,找出第(m+n)/2+1大的数就行了,如果 m+n是偶数,需要找出第(m+n)/2和(m+n)/2+1大的两个数,然后求其平均值。

那么问题来了……怎么找两个有序数组中第k大的数?

首先考虑一些基准情形:如果找的是第1大的数,显然就是两个数组的第一个值取较小的那个;如果某一个数组的长度为0,那么就求变成了另一个数组中第k大的数,直接在该数组中读取就好了。

假设现在有两个数组a,b,其长度分别为m,n,并假设m>n,找第k大的数;我们的目的是缩小目标数存在的范围,直到到达某一个基准情形为止。

令j=min(n,k/2),i=k-j;那么这个时候,数组a的第i大左边与数组b的第j大左边就一共有k个数,比较a[i-1]和b[j-1],哪一个数小,则说明,目标值还在那个数的右边(包括那个数),对应的,在另一个数的左边。完成了范围的缩小,此时要查找剩余范围里的就不是第k大的数了,而是第i大或者第j大。

double findMedianSortedArrays(vector<int>& a, vector<int>& b) {
        int n1=a.size();
        int n2=b.size();
        int k=(n1+n2)/2;
        int m1=kth(a,0,n1,b,0,n2,k+1);
        if((n1+n2)%2==0){
            int m2=kth(a,0,n1,b,0,n2,k);
            return ((double)m1+m2)/2;
        }
        return m1;
    }
    int kth(vector<int>& a,int s1,int n1,vector<int>& b,int s2,int n2,int k){
        if(n1<n2)return kth(b,s2,n2,a,s1,n1,k);
        if(n2==0)return a[s1+k-1];
        if(k==1)return min(a[s1],b[s2]);
        int j=min(n2,k/2);
        int i=k-j;
        if(a[s1+i-1]>b[s2+j-1])return kth(a,s1,i,b,s2+j,n2-j,k-j);
        return kth(a,s1+i,n1-i,b,s2,j,k-i);
    }
};


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值