队列之双端队列

本文介绍了如何使用辅助双端队列在O(1)时间复杂度内实现队列的最大值查找、元素入队和出队操作。在每次入队时,如果新元素大于队列尾部元素,则更新队列,保持队首元素为最大值。当队列为空时,max_value和pop_front返回-1。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

剑指 Offer 59 - II. 队列的最大值

题目描述

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

示例 1:

输入: 
["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
[[],[1],[2],[],[],[]]
输出: [null,null,null,2,1,2]

示例 2:

输入: 
["MaxQueue","pop_front","max_value"]
[[],[],[]]
输出: [null,-1,-1]

解法:辅助双端队列

使用一个双端队列 dequeue,在每次入队时,如果 dequeue 队尾元素小于即将入队的元素 value,则将小于 value 的元素全部出队后,再将 value 入队;否则直接入队。

这时,辅助队列 dequeue 队首元素就是队列的最大值。

var MaxQueue = function() {
  this.queue = []
  this.dequeue = []
};

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

/** 
 * @param {number} value
 * @return {void}
 */
MaxQueue.prototype.push_back = function(value) {
  this.queue.push(value)
  while(this.dequeue.length && value > this.dequeue[this.dequeue.length - 1]){
    this.dequeue.pop()
  }
  this.dequeue.push(value)
};

/**
 * @return {number}
 */
MaxQueue.prototype.pop_front = function() { 
  if(!this.queue.length) return -1
  let val = this.queue.shift()
  if(val === this.dequeue[0]){   
    return this.dequeue.shift()
  }
  return val
};

/**
 * 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()
 */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值