• LeetCode(703):找出数据流中的第K大元素


    题目描述

    image1.png

    实现思路一:堆

    一种比较经典的做法是:维护一个只有K个元素的最小堆
    这样,当前数据流中的第K大元素一定位于堆的顶部(数组头部)
    当有新的数据进入时,将其与堆顶元素比较
    若堆顶元素更大,则无视新的数据
    若堆顶元素更小,则将其移出堆,并将新元素放入堆,再重新整理堆


    在C++标准库中,堆可以使用PriorityQueue这个数据结构实现

    实现思路二:数组splice

    Javascript为数组提供了一种 splice方法
    它可以向/从数组中添加/删除项目(会改变原始数组)
    它可以接收3个参数
    image2.png
    表示可以删除index处开始的0个或多个元素,并使用第三个参数 来替换被删除的元素


    在每次接收新数据时
    1、将新数据push入数组
    2、对数据进行从大到小的排序
    3、如果数组长度大于K,则删除索引大于等于K的所有元素
    (使得每一次接收新数据后,数组的大小保持在K)
    最后返回索引为K-1的元素即可

    代码实现(Javascript)

    /**
     * @param {number} k
     * @param {number[]} nums
     */
    var KthLargest = function(k, nums) {
        this.k=k
        this.arr=new Array()
        if(nums.length>0){
            for(var i in nums){
                this.arr.push(nums[i])
            }
        }
        
    };
    
    /** 
     * @param {number} val
     * @return {number}
     */
    KthLargest.prototype.add = function(val) {
        this.arr.push(val)
        this.arr.sort(function(a,b){
            return b-a
        })
        if(this.arr.length>this.k){
            this.arr.splice(this.k, this.arr.length-this.k)
        }
        return this.arr[this.k-1]
    };
    
  • 相关阅读:
    《大型网站技术架构》学习笔记——架构演化
    ASP.NET MVC之Html.RenderAction
    设计模式学习笔记——面向对象设计原则
    设计模式学习笔记——类图
    观察者模式
    泛型接口
    泛型的实例化应用
    多线程第二种方式-实现runnable
    对象中的某个属性不希望被序例化--transient
    对象序例化
  • 原文地址:https://www.cnblogs.com/baebae996/p/13869753.html
Copyright © 2020-2023  润新知