题目描述
设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。
请实现 KthLargest 类:
- KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。
- int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。 示例:
输入:
["KthLargest", "add", "add", "add", "add", "add"]
[[3, [4, 5, 8, 2]], [3], [5], [10], [9], [4]]
输出:
[null, 4, 5, 5, 8, 8]
解释:
KthLargest kthLargest = new KthLargest(3, [4, 5, 8, 2]);
kthLargest.add(3); // return 4
kthLargest.add(5); // return 5
kthLargest.add(10); // return 5
kthLargest.add(9); // return 8
kthLargest.add(4); // return 8
解题思路
- 维护一个大顶堆maxheap
- 每次调用add的时候,都维护一个新的maxheap的length
- 循环去判断当前val再maxheap中的位置,并终止循环
- 通过数组的splice方法,把val插入到maxheap中
- 通过数组的slice方法返回地k-1个值,就是排序后的第k大的值
代码1
var KthLargest = function(k, nums) {
this.maxheap = nums.sort((a, b) => b -a);
this.k = k;
}
KthLargest.prototype.add = function(val){
let len = this.maxheap.length;
for(let i = 0; i < len; i++){
if(val >= this.maxheap[i]){
len = i;
break;
}
}
this.maxheap.splice(len, 0, val);
return this.maxheap[this.k - 1];
}
代码2
var KthLargest = function(k, nums){
this.nums = nums;
this.k = k;
}
KthLargest.prototype.add = function(val){
// 需要注意的是,不能在push后面直接跟着sort().因为push后返回的是新数组的长度
this.nums.push(val);
return this.nums.sort((a, b) => b - a)[this.k - 1];
}