求两个有序数组的第k大的数(默认两有序数组都为从小到大)

一、两有序数组第k大的数

    public static int topk(int[] a,int[] b,int alen, int blen, int k) {
        if(alen==0) {
            return b[b.length-blen+k-1];
        }
        if(blen==0) {
            return a[a.length-alen+k-1];
        }
        if(k==1) {
            return a[a.length-alen]<b[b.length-blen]?a[a.length-alen]:b[b.length-blen];
        }
        int amin = alen>k/2?k/2:alen;
        int bmin = blen>k/2?k/2:blen;
        if(a[a.length-alen+amin-1] < b[b.length-blen+bmin-1]) {
            k = k - amin;
            alen = alen - amin;
            return topk(a,b,alen,blen,k);
        }else if(a[a.length-alen+amin-1] > b[b.length-blen+bmin-1]){
            k = k - bmin;
            blen = blen - bmin;
            return topk(a,b,alen,blen,k);
        }else {
            k = k - amin - bmin;
            if(k == 0) {
                return a[a.length-alen+amin-1];
            }
            alen = alen - amin;
            blen = blen - bmin;
            return topk(a,b,alen,blen,k);
        }
    }

 下面这种可能好理解,但是性能就会比较差

    public static int topk(int[] a,int[] b, int k) {
        int alen = a.length;
        int blen = b.length;
        if(alen==0) {
            return b[k-1];
        }
        if(blen==0) {
            return a[k-1];
        }
        if(k==1) {
            return a[0]<b[0]?a[0]:b[0];
        }
        int amin = alen>k/2?k/2:alen;
        int bmin = blen>k/2?k/2:blen;
        int[] newa = null;
        int[] newb = null;
        if(a[amin-1] < b[bmin-1]) {
            k = k - amin;
            alen = alen - amin;
            newa = Arrays.copyOfRange(a, a.length-alen, a.length);
            newb = Arrays.copyOfRange(b, b.length-blen, b.length);
            return topk(newa,newb,k);
        }else if(a[amin-1] > b[bmin-1]){
            k = k - bmin;
            blen = blen - bmin;
            newa = Arrays.copyOfRange(a, a.length-alen, a.length);
            newb = Arrays.copyOfRange(b, b.length-blen, b.length);
            return topk(newa,newb,k);
        }else {
            k = k - amin - bmin;
            if(k == 0) {
                return a[amin-1];
            }
            alen = alen - amin;
            blen = blen - bmin;
            newa = Arrays.copyOfRange(a, a.length-alen, a.length);
            newb = Arrays.copyOfRange(b, b.length-blen, b.length);
            return topk(newa,newb,k);
        }
    }

 

posted @ 2019-06-14 16:46  海平面下的我们  阅读(492)  评论(0编辑  收藏  举报