215. 数组中的第K个最大元素

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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted on   老菜农  阅读(42)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律

导航

统计信息

点击右上角即可分享
微信分享提示