堆和优先级队列4:不泡妹子都要会的LeetCode7道题之二
Posted 纵横千里,捭阖四方
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了堆和优先级队列4:不泡妹子都要会的LeetCode7道题之二相关的知识,希望对你有一定的参考价值。
本文介绍的两个题比前面的更重要。这两个题的出现频率非常高,虽然每个题都还有多种方式,但是最正统的就是用堆来做。更有意思的是这两个题一般只说方案,不用手写。如果想清楚了就能应付一道面试题,何乐而不为呢?
1.LeetCode215 数组中的第K大元素
这个题其实有多种解法,先看使用优先级队列的。如果使用堆,记住一个口诀:
找K大用小根堆
找K小用大根堆。
如果参考堆的特性,不难理解,请读者想想为啥要这样,这一点非常重要。
public int findKthLargest(int[] nums, int k) {
// 正确性判断
if (0 == nums.length || null == nums || k <= 0 || k > nums.length) {
return -1;
}
// 构造优先队列,默认为最小堆,传入自定义的比较器转换成最大堆
PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> b - a);
for (Integer num : nums) {
pq.add(num);
}
for (int i = 0; i < k - 1; i++) {
pq.remove();
}
return pq.peek();
}
这个题还可以用其他方式,例如快速排序法,这个我们后面再说,
这题更重要的场景是如果从几个G的大数据中找第K个最大,或者从流数据中找第K个最大,此时几乎只能用堆来进行,这也是为什么本题如此重要的原因。
2.LeetCode 295 数据流的中位数
也是剑指offer41题
这个题的一种思路是使用两个优先级队列,怎么做呢,我发现LeetCode的网站已经做了很详细的介绍,直接看这里吧
这题貌似还有多种其他的方式,例如简单排序等,但是这个在流数据中是不行的,理解并记住两个堆的方法就行了。
以上是关于堆和优先级队列4:不泡妹子都要会的LeetCode7道题之二的主要内容,如果未能解决你的问题,请参考以下文章