手撸二叉树之数据流中的第 K 大元素
Hello, 大家好,今天是我参加 8 月更文的第 11 天,今天给大家带来的关于二叉树相关的算法题是数据流中的第 K 大元素,正文如下:
题目
设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。
请实现 KthLargest 类:
KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。
int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。
示例
复制代码
解题思路
TopK 算法在面试中常问, 本题的解题思路如下:
使用大小为 k 的小根堆,在初始化的时候,保证堆中的元素个数不超过 K。
在每次 add() 的时候,将新元素 push() 到堆中,如果此时堆中的元素超过了 K,那么需要把堆中的最小元素(堆顶)pop()出来。
此时堆中的最小元素(堆顶)就是整个数据流中的第 K 大元素。
在本题中,我使用的是优先队列来存储前 K 大的元素,其中优先队列的队头为队列中最小的元素,也就是第 kk 大的元素。
代码实现
复制代码
最后
复杂度分析
时间复杂度:初始化时间复杂度为:O(nlogk) ,其中 n 为初始化时 nums 的长度;单次插入时间复杂度为:O(logk);
空间复杂度:O(k)。需要使用优先队列存储前 k 大的元素。
版权声明: 本文为 InfoQ 作者【HelloWorld杰少】的原创文章。
原文链接:【http://xie.infoq.cn/article/524244f40c9ef13f1b8b1fbfe】。文章转载请联系作者。
评论