最小的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;
    }
全部评论

相关推荐

10-25 00:32
香梨想要offer:感觉考研以后好好学 后面能乱杀,目前这简历有点难
点赞 评论 收藏
分享
牛舌:如果我不想去,不管对方给了多少,我一般都会说你们给得太低了。这样他们就会给下一个offer的人更高的薪资了。
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务