堆和优先级队列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道题之二的主要内容,如果未能解决你的问题,请参考以下文章

日常系列LeetCode《11·堆和优先队列篇》

堆和优先级队列2:java实现堆和优先级队列

数据结构 Java 版堆和优先级队列(超详解)

数据结构 Java 版堆和优先级队列(超详解)

升序堆和降序堆(优先队列) 洛谷1801

如何用 Python 实现堆和优先队列?