zoukankan      html  css  js  c++  java
  • 求两个有序数组的第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);
            }
        }
  • 相关阅读:
    LINUX内核参数调优集锦
    性能测试基础-开门篇3(LR常用函数介绍)
    高并发WEB服务的演变
    数据链路层学习之LLDP
    Win8.1 Metro应用无法联网终极解决方法
    Win8.1 Metro应用无法联网,提示“无法加载此页面”解决方法!(看红色字体部分)
    SecureCrt脚本(三)二级对象之Screen详解
    SecureCrt自动化
    Python数据类型一:数字与运算符
    高阶函数
  • 原文地址:https://www.cnblogs.com/erdanyang/p/11024139.html
Copyright © 2011-2022 走看看