剑指 Offer 59 - II. 队列的最大值(有问题,暂未解决)

题目:

请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1。

在这里插入图片描述

思路

在一个数据队的基础上,维护一个单调递减的辅助队,辅助队的队首即为数据队的最大值

  • 若队列为空,pop_front 和 max_value 需要返回 -1。
  • 故当一个元素进入数据队时,循环判断 若辅助队不为空 且 该元素大于辅助队队尾的元素,则删除辅助队队尾元素,直到辅助队为空 或 该元素小于辅助队队尾元素(辅助队单调递减),再让该元素入辅助队,这样就维持了一个单调递减的辅助栈
函数设计:
  • 请push_back(value)函数:
    1.让value进入数据队
    2.循环判断 若辅助队不为空且value大于辅助队队尾的元素,则删除辅助队队尾元素,直到辅助队为空或该元素小于辅助队队尾元素(单调递减),再让该元素进入辅助队

  • max_value()函数:
    1.若辅助队为空,则返回-1
    2.若辅助队不为空,则返回辅助队队首元素

  • pop_front()函数:
    1.若数据队为空,则返回-1
    2.若数据队不为空,表示有值可以输出,则需判断要被输出的元素是否会影响到最大值,只需判断该元素是否等于辅助队的队首元素,如果不等于说明该元素不是最大值,且位于最大值之前 不会对最大值产生影响

var MaxQueue = function() {
    this.stack1 = []; //数据队
    this.stack2 = []; //辅助队
};

/**
 * @return {number}
 */
MaxQueue.prototype.max_value = function() {
    if(this.stack2.length == 0){
        return -1;
    }
    return this.stack1[0];
};

/** 
 * @param {number} value
 * @return {void}
 */
MaxQueue.prototype.push_back = function(value) {
    this.stack1.push(value); //进数据队
    while(this.stack2.length && this.stack2[this.stack2.length-1] < value){
        this.stack2.pop();  //删除辅助队队尾元素,直到辅助队为空或该元素小于辅助队队尾元素(单调递减)
    }
    this.stack2.push(value);
};

/**
 * @return {number}
 */
MaxQueue.prototype.pop_front = function() {
    if(this.stack1.length == 0){//数据队为空
       return -1;
    }
    let value = this.stack1.shift(); //剪切数据队队首元素
    if(value == this.stack2[0]){ //判断数据队的队首元素与辅助队是否相等
       this.stack2.shift();  //剪切辅助队队首元素
    }
    return value;
};

/**
 * Your MaxQueue object will be instantiated and called as such:
 * var obj = new MaxQueue()
 * var param_1 = obj.max_value()
 * obj.push_back(value)
 * var param_3 = obj.pop_front()
 */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值