找出其中最小的K個數
阿新 • • 發佈:2019-09-14
輸入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);
}
}