[路飞]_703. 数据流中的第 K 大元素

132 阅读1分钟

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战

703. 数据流中的第 K 大元素

设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。

请实现 KthLargest 类:

KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。

int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。

「示例1:」
输入:
["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
「示例2:」
输入:
["KthLargest", "add", "add", "add", "add", "add"]
[[[4, [2, 6, 1, 9]], [18], [12], [16], [23], [3]]
输出:
[null, 9, 9, 9, 9, 6]
​
解释:
KthLargest kthLargest = new KthLargest(4, [2, 6, 1, 9]);
kthLargest.add(18);   // return 9
kthLargest.add(12);   // return 9
kthLargest.add(16);   // return 9
kthLargest.add(23);   // return 9
kthLargest.add(3);    // return 6
提示:
  • 1 <= k <= 104
  • 0 <= nums.length <= 104
  • -104 <= nums[i] <= 104
  • -104 <= val <= 104
  • 最多调用 add 方法 104 次
  • 题目数据保证,在查找第 k 大元素时,数组中至少有 k 个元素

解题思路

  1. 由题意我们可知,题目让我们通过不断的向数组里面push一个值,然后返回一个当前的第k大元素值

  2. 首先,我们在KthLargest方法里面分别创建一个全局变量k和nums

  3. 其次,我们在在add方法里面把add方法所给的val值push到nums里面

  4. 然后,对nums数组按照从大到小的顺序进行排序

  5. 最后,我们返回nums数组的第k - 1个值即是,当前数组中的第k大元素

代码实现

/**
 * @param {number} k
 * @param {number[]} nums
 */
var KthLargest = function(k, nums) {
  this.k = k; // 声明一个全局变量k
  this.nums = nums; // 声明一个全局变量nums数组,并且初始化数组的值为题目给的值
};
​
/** 
 * @param {number} val
 * @return {number}
 */
KthLargest.prototype.add = function(val) {
  this.nums.push(val); // 向数组里面push一下当前接受到的值
  this.nums.sort((a, b) => b - a); // 对数组进行从大到小的排序
  // console.log(this.nums); 
  return this.nums[this.k - 1]; // 返回数组的第k - 1位置的值即可
};
​

如果你对这道题目还有疑问的话,可以在评论区进行留言;