题目
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
思路:
暴力解法。
先申明一个空数组,然后循环遍历数组nums,将前k个大的数推进这个数组。
这个如果k>nums,那么数组nums推完即可。 如果k<nums,那么推k个数即可。
然后,每次来一个数的时候,将这个数插入数组合适的位置,然后删掉数组最头上一项。
这里是要做一个判断的,如果数组长度小于k,那么插入进去后,不用删掉数
代码如下:
/**
* @param {number} k
* @param {number[]} nums
*/
var KthLargest = function(k, nums) {
this.index = k;
let arr = [];
let len =Math.min(k,nums.length);
for(let i=0;i<len;i++){
let maxIndex = 0
for(let j=0;j<nums.length;j++){
if(nums[j]>nums[maxIndex]){
maxIndex = j
}
}
arr.unshift(nums[maxIndex])
nums.splice(maxIndex,1)
}
this.dataList = arr;
};
/**
* @param {number} val
* @return {number}
*/
KthLargest.prototype.add = function(val) {
let insertIndex = 0;
for(let i=0;i<this.dataList.length;i++){
if(val>this.dataList[i]){
insertIndex = i+1;
}else{
break;
}
}
if(insertIndex>0 || this.dataList.length < this.index){
this.dataList.splice(insertIndex,0,val);
if(this.dataList.length > this.index){
this.dataList.shift();
}
}
return this.dataList[0]
};