题目链接
题目描述
输入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.PriorityQueue;
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
if (input==null || input.length==0 || k>input.length || k<=0) return new ArrayList<>();
PriorityQueue<Integer> pq = new PriorityQueue<>((o1, o2)->o2-o1);
for (int num: input){
pq.add(num);
if (pq.size()>k) pq.remove();
}
return new ArrayList<>(pq);
}
}