1. 程式人生 > 實用技巧 >最小的K個數

最小的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;