题目描述:
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
思路分析:
可以用容量为k的大顶堆来解决该题目,大顶堆堆顶元素最大,其他元素都小于堆顶元素,每当遇到比堆顶元素小的元素,就加入堆中,堆中元素个数为k+1时,删除堆顶元素。最后返回堆中的所有元素。
参考代码:
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
if(input == null || input.length == 0 || k <= 0 || k > input.length)return new ArrayList<>();
Queue<Integer> heap = new PriorityQueue<>(k, (p1, p2) -> Integer.compare(p2, p1));
for(int i = 0; i < input.length; i++){
if(heap.size() <= k || heap.peek() > input[i])heap.offer(input[i]);
if(heap.size() > k)heap.poll();
}
ArrayList<Integer> list = new ArrayList<>();
while(!heap.isEmpty()){
list.add(heap.poll());
}
return list;
}
注意:
该题用到了堆:Queue heap = new PriprityQueue(k, (p1, p2) ->Integer.compare(p2, p1));
还有poll(),peek(),offer()方法,平时用的比较少,得留心。