215. 数组中的第K个最大元素
优先队列的思路是很朴素的。由于找第 K 大元素,其实就是整个数组排序以后后半部分最小的那个元素。因此,我们可以维护一个有 K 个元素的最小堆:
如果当前堆不满,直接添加;
堆满的时候,如果新读到的数小于等于堆顶,肯定不是我们要找的元素,只有新遍历到的数大于堆顶的时候,才将堆顶拿出,然后放入新读到的数,进而让堆自己去调整内部结构。
说明:这里最合适的操作其实是 replace(),即直接把新读进来的元素放在堆顶,然后执行下沉(siftDown())操作。Java 当中的 PriorityQueue 没有提供这个操作,只好先 poll() 再 offer()。
优先队列的写法就很多了,这里只例举一个有代表性的,其它的写法大同小异,没有本质差别。
public int findKthLargest(int[] nums, int k) {
//建立小根堆
PriorityQueue<Integer> queue = new PriorityQueue<>(k, Integer::compare);
//前K个数堆化
for(int i = 0; i < k; i++) {
queue.offer(nums[i]);
}
//向堆中插入剩下length - k个元素
for(int i = k; i < nums.length; i++){
//获取堆顶最小值
int peek = queue.peek();
//如果堆顶最小值大于当前的数,弹出并加入当前的数字, 那么此时的数字就是第length-k个最小的数, 反过来想就是第k个最大的数
if(peek < nums[i]){
queue.poll();
queue.offer(nums[i]);
}
}
//获取堆顶元素第K个最大的数字
return queue.peek();
}
作者:liweiwei1419
链接:https://leetcode.cn/problems/kth-largest-element-in-an-array/solution/partitionfen-er-zhi-zhi-you-xian-dui-lie-java-dai-/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。