最小的K个数

最小的K个数

题目描述:

输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。

题目思路:

一、冒泡排序

排序方法太多了,从小到大排序,然后取前K个值。

  public int[] getLeastNumbers(int[] arr, int k) {
        int[] res = new int[k];
       //排序以后取K个
        for (int i = 0; i < arr.length; i++) {
            for (int j = i+1; j < arr.length  ; j++) {
                if (arr[i] > arr[j]){
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        System.arraycopy(arr,0,res,0,k);
        return res;
    }

二、堆

堆的数量为k

依次入堆,当堆满时就弹出最大的数字

剩下的就是最小的k个数

   if (k == 0){
            return new int[0];
        }
        // 使用一个大顶堆
        // java的priorityQueue默认是小顶堆,添加comparator参数使其变成最大堆
        Queue<Integer> heap = new PriorityQueue<>((o1, o2) -> Integer.compare(o2, o1));
        for (int e : arr) {
            // 当前元素小于堆顶元素才会入堆
            if (heap.isEmpty() || heap.size() < k || e < heap.peek()){
                heap.offer(e);
            }
            if (heap.size() > k){
                // 删除堆顶最大元素
                heap.poll();
            }

        }

        // 将堆中的元素存入数组
        int[] res = new int[heap.size()];
        int j = 0;
        for (int e : heap) {
            res[j++] = e;
        }
        return res;
posted @ 2020-08-13 22:30  杨小星儿  阅读(99)  评论(0)    收藏  举报