Lc 895. Maximum Frequency Stack 最大频率栈 JS

本文介绍了一种使用栈和字典实现的高频元素栈数据结构,该结构能够在O(1)的时间复杂度内找到当前栈中出现频率最高的元素并将其弹出。通过维护一个元素出现频率的计数器,以及一个记录每个元素最后一次出现频率的字典,可以高效地完成这一任务。

原题

思路

每一个新元素被 pop,他的出现次数,是他前一个出现相同元素的 次数 + 1
注意节约资源。

代码


var FreqStack = function() {
    this.stack = [];
    this.disc = []; // 字典 帮助判断
};

/** 
 * @param {number} x
 * @return {void}
 */
FreqStack.prototype.push = function(x) {
    let count = 1;
    if(this.disc.indexOf(x) < 0) { // 不存在
        this.disc.push(x);
    } else { // 之前确实有这个元素 从后向前找
        let len = this.stack.length;
        for(let i = len -1; i >= 0; --i) {
            if(this.stack[i].value === x) {
                count += this.stack[i].count;
                break;
            }
        }
    }
    
    this.stack.push({
        value: x,
        count
    });
};

/**
 * @return {number}
 */
FreqStack.prototype.pop = function() {
    let list = [];
    let max = 0;
    let len = this.stack.length;
    let toRemoveIndex = -1;
    for(let i = len - 1; i >= 0; --i) {
        let obj = this.stack[i];
        if(obj.count > max) {
            max = obj.count;
            list = [obj.value];
            toRemoveIndex = i;
        }
    }
    this.stack.splice(toRemoveIndex, 1);
    return list[0];
};

/** 
 * Your FreqStack object will be instantiated and called as such:
 * var obj = Object.create(FreqStack).createNew()
 * obj.push(x)
 * var param_2 = obj.pop()
 */
复制代码

转载于:https://juejin.im/post/5c6f3a305188252d56427134

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值