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

338 阅读1分钟

题目

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]
};