最小的k个数

最小的K个数

https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=196&&tqId=37099&rp=1&ru=/activity/oj&qru=/ta/job-code-total/question-ranking

//堆
    //一种小顶堆 另一种大顶堆
    //大顶堆最顶上是最大的数 当堆中存入k个数的时候,第k+1个数a来比较其堆顶的数b。若a>=b,则忽略;因为
    //堆中k个数都小于等于a;如果a<b,把堆顶poll,把a加入,重新调整堆;
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> list=new ArrayList<>();
        //注意参数判断
        if(input==null || input.length==0 ||k<=0) return list; 
        //默认是小顶堆 如果保证大顶堆 要重写比较器
        PriorityQueue<Integer> priorityQueue=new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                //return o2-o1;
                return o2-o1;
            }
        });
        for (int i=0;i<input.length;i++){
            if (i<=k-1){
                priorityQueue.add(input[i]);
            }else {
                int top = priorityQueue.peek();
                if(top>input[i]){
                    priorityQueue.poll();
                    priorityQueue.add(input[i]);
                }
            }
        }
        //在不足k个元素的时候 需要返回空list
        if(priorityQueue.size()<k) return list;
        while (priorityQueue.size()>0){
            list.add(priorityQueue.poll());
        }
        //保证list里的数据从小到大
        Collections.reverse(list);
        return list;
    }

第二种:冒泡

 public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k){
        ArrayList<Integer> list=new ArrayList<>();
        if (input==null||input.length==0 ||k<=0) return list;
        if (input.length<k) return list;
        for (int p=1;p<=k;p++){
            for (int i=0;i<input.length-p;i++){
                if (input[i]<input[i+1]) swap(input,i,i+1);
            }
        }
        for (int i=input.length-1;i>=input.length-k;i--){
            System.out.println(input[i]);

            list.add(input[i]);
        }
        return list;
    }

    private void swap(int[] input, int i, int i1) {
        int temp=input[i];
        input[i]=input[i1];
        input[i1]=temp;
    }
全部评论

相关推荐

沉淀一会:1.同学你面试评价不错,概率很大,请耐心等待; 2.你的排名比较靠前,不要担心,耐心等待; 3.问题不大,正在审批,不要着急签其他公司,等等我们! 4.预计9月中下旬,安心过节; 5.下周会有结果,请耐心等待下; 6.可能国庆节前后,一有结果我马上通知你; 7.预计10月中旬,再坚持一下; 8.正在走流程,就这两天了; 9.同学,结果我也不知道,你如果查到了也告诉我一声; 10.同学你出线不明朗,建议签其他公司保底! 11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务