Median of two sorted array

There are two sorted arrays A and B 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)).


median基本上都是find kth smallest 的变种。 比如用random selection来解决 n th unordered array的问题,求median其实就是求n/2.

这个问题是find kth in two sorted array. 总之还是要先理解如何在find kth in two sorted array. 


给定两个array A,B, 每次从A截取K/2, 当然,如果k/2> len(m),就截取m, 比较 pa-1,pb-1的大小,如果pa-1<pb-1,那么就可以放心的drop掉前面的部分 (pa)部分, 如果不是的话,那么就drop掉 B的pb部分。 另外的array全部包括。 这个地方写的时候有点糊涂是要不要取一半。后来想通了,是kth 不是median. 当然如果是median, 那边可以取一半。 递归到最后的终止条件, k=1, m=0,


class Solution {
public:
    double findMedianSortedArrays(int A[], int m, int B[], int n) {
        int ind=m+n;
        if (ind%2)
        {
            return find_kth(A,m,B,n,(m+n)/2+1);
        }
        else
            return (find_kth(A,m,B,n,ind/2+1)+find_kth(A,m,B,n,ind/2))/2.;
    }
    
    /* find kth in two sorted array */
    double find_kth(int A[], int m, int B[], int n, int k)
    {
        // keep m<n
        if (m>n)
            return find_kth(B,n,A,m,k);
        // base 1: one small array contains nothing
        if (m==0)
            return B[k-1];
        // base 2: only one left
        if (k==1)
            return min(A[0],B[0]);
        int ind_A=min(k/2,m); // reduce k/2 for small array
        int ind_B=k-ind_A;
        if (A[ind_A-1]<=B[ind_B-1])
            // drop k-ind_A
            return find_kth(A+ind_A, m-ind_A,B,n,k-ind_A);
        else// drop k-ind_B
            return find_kth(A,m,B+ind_B,n-ind_B,k-ind_B);
    }
};


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值