题目来源:leetcode 703. 数据流中的第 K 大元素
题目
设计一个找到数据流中第 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
提示:
1 <= k <= 104
0 <= nums.length <= 104
-104 <= nums[i] <= 104
-104 <= val <= 104
最多调用 add 方法 104 次
题目数据保证,在查找第 k 大元素时,数组中至少有 k 个元素
提示:
1 <= stones.length <= 30
1 <= stones[i] <= 1000
分析
- 首先我们可以在初始化
KthLargest时,对数组进行排序,方便后续执行add - 通过
splice方法添加元素,当参数二howmany为0时则是添加操作
伪代码
- 初始化变量
arr并进行从大到小排序,初始化变量k值 - 默认
pos插入位置为数组末尾 - 通过遍历寻找
pos插入位置,由于之前已经做了大到小排序,此时我们只需判断需要添加的值val大于当前值即可找到需要插入的位置pos - 依据插入后的数组返回数据流中的第 K 大元素
this.arr[this.k-1]
代码实现
/**
* @param {number} k
* @param {number[]} nums
*/
var KthLargest = function(k, nums) {
this.arr = nums.sort((a,b) => b - a)
this.k = k
};
/**
* @param {number} val
* @return {number}
*/
KthLargest.prototype.add = function(val) {
let pos = this.arr.length
for(let i = 0; i < pos ;i++){
if(val >= this.arr[i]){
pos = i
break
}
}
this.minHeap.splice(pos,0,val)
return this.arr[this.k-1]
};
/**
* Your KthLargest object will be instantiated and called as such:
* var obj = new KthLargest(k, nums)
* var param_1 = obj.add(val)
*/