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

103 阅读1分钟

题目地址

题目描述

设计一个找到数据流中第 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];
}