找前k个最大值,建一个大小为k的小堆;
找前k个最小值,建一个大小为k的大堆;
思路:找前k个最大值为例
先取前K个数,进行键小堆,然后依次往后遍历,每次取一个元素,然后和堆顶元素进行比较,若比堆顶元素小,则继续往后遍历,大的话,将堆顶元素与堆的最后一个元素互换,然后将最后一个元素弹出,在进行调整堆,使得堆依然是一个小根堆。再继续往后遍历,依次循环。直到遍历完为止。
例如给一个数组,求数组前K个最大值
public static void topK(int[] array,int k) {
//1、大小为K的小堆
PriorityQueue<Integer> minHeap = new PriorityQueue<>(k, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o1-o2;
}
});
//2、遍历数组
for (int i = 0; i < array.length; i++) {
if(minHeap.size() < k) {
minHeap.offer(array[i]);
}else {
Integer top = minHeap.peek();
if(top != null) {
if (array[i] > top) {
minHeap.poll();
minHeap.offer(array[i]);
}
}
}
}
for (int i = 0; i < k; i++) {
System.out.println(minHeap.poll());
}
}