1. 程式人生 > >找出其中最小的K個數

找出其中最小的K個數

輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4。

 

思路:

大小為 K 的最小堆

  • 複雜度:O(NlogK) + O(K)
  • 特別適合處理海量資料

應該使用大頂堆來維護最小堆,而不能直接建立一個小頂堆並設定一個大小,企圖讓小頂堆中的元素都是最小元素。

維護一個大小為 K 的最小堆過程如下:在新增一個元素之後,如果大頂堆的大小大於 K,那麼需要將大頂堆的堆頂元素去除。

import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.Comparator;
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int[] nums, int k) {
    if (k > nums.length || k <= 0)
        return new ArrayList<>();
    PriorityQueue<Integer> maxHeap = new PriorityQueue<>((o1, o2) -> o2 - o1);
    for (int num : nums) {
        maxHeap.add(num);
        if (maxHeap.size() > k)
            maxHeap.poll();
    }
    return new ArrayList<>(maxHeap);
}
}