看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~
谁能九层台,不用累土起!
题目
设计一个找到数据流中第 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 <= 1040 <= nums.length <= 104-104 <= nums[i] <= 104-104 <= val <= 104- 最多调用
add方法104次 - 题目数据保证,在查找第
k大元素时,数组中至少有k个元素
解题思路
- 我们记录每次要返回的第
k大元素 - 先将
nums进行排序,截取k个大元素 - 在
add时先push操作 - 然后重新快排,返回第
k项
解题代码
/**
* @param {number} k
* @param {number[]} nums
*/
var KthLargest = function(k, nums) {
this.l = k
nums.sort((a,b)=>b-a)
nums.length = k
this.arr = nums
};
/**
* @param {number} val
* @return {number}
*/
KthLargest.prototype.add = function(val) {
this.arr.push(val)
this.arr.sort((a,b)=>b-a)
this.arr.length = this.l
return this.arr[this.l-1]
};
如有任何问题或建议,欢迎留言讨论!