排序与堆 - 40.最小的k个数

在这里插入图片描述
思路1:排序,分割数组即可。

思路2:大根堆的实现,由于是最小的K个值,所以我们将大根堆的容量设置为K,当大根堆不满时,直接向其中添加数据,当满时对比堆顶和插入值的大小,如果比堆顶小,那么就将堆顶删除,然后插入数据。当插入结束,堆中的所有数据都是此序列的最小的K个数。那么我们就使用优先级队列来实现。

 public int[] getLeastNumbers(int[] arr, int k) {
        if(k == 0) {
            return new int[0];
        }
        Queue<Integer> queue = new PriorityQueue<>((a, b) -> (b - a));
        for(int i: arr) {
            if(queue.size() < k) {
                queue.add(i);
            } else {
                if(queue.peek() > i) {
                    queue.remove();
                    queue.add(i);
                }
            }
        }
        int[] ref = new int[k];
        int cnt = 0;
        while(queue.size() > 0) {
            ref[cnt++] = queue.remove();
        }
        return ref;
    }

思路3:桶思想,由于给定参数的限制我们可以利用桶思想进行排序。遍历arr之后,把值对应到桶,有几个相同的值,那么对应的桶的值+1。最后遍历桶。

    public int[] getLeastNumbers(int[] arr, int k) {
            int[] res = new int[k];
            if(k == 0) return res;
            if(k == arr.length) return arr;

            //桶思想
            int[] bulck = new int[100001];
            for(int i = 0 ; i < arr.length;i++){
                bulck[arr[i]]++;
            }



            //遍历bluck,去出不为0的下标
            int index = 0;
            for(int i = 0 ; i < bulck.length;i++){
                while(bulck[i]!=0){
                    res[index++] = i;
                    bulck[i]--;
                    if(index == k) return res;
                }

            }

            return res;
        }
原创文章 139 获赞 23 访问量 5922

猜你喜欢

转载自blog.csdn.net/weixin_44916741/article/details/104415366
今日推荐