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

Posted 沿着路走到底

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 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]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

示例 2:

输入: 
["MaxQueue","pop_front","max_value"]
[[],[],[]]
输出: [null,-1,-1]
// 采用双端队列实现
var MaxQueue = function() 
  // 存储队列数据
  this.queue = 

  // 双端队列维护最大值(每个阶段的最大值)
  this.deque = 

  this.countQ = 0
  this.headQ = 0
  this.countD = 0
  this.headD = 0
;


/** 获取队列最大值
* @return number
*/
MaxQueue.prototype.max_value = function() 
  if (this.isEmptyDeque()) return -1
  return this.deque[this.headD]
;

/** 队尾入队
* @param number value
* @return void
*/
MaxQueue.prototype.push_back = function(value) 
  // 数据在queue入队
  this.queue[this.countQ++] = value

  // 检测是否可以将数据添加到双端队列
  // - 队列不能为空
  // - value 大于队尾值
  while(!this.isEmptyDeque() && value > this.deque[this.countD - 1]) 
    // 删除当前队尾值
    delete this.deque[--this.countD]
  

  // 将 value 入队
  this.deque[this.countD++] = value

;

/** 队首出队
* @return number
*/
MaxQueue.prototype.pop_front = function() 
  if (this.isEmptyQuque()) return -1

  // 比较 queue 与 deque 的队首值,如果相同,deque队首出队
  const headData = this.queue[this.headQ]
  delete this.queue[this.headQ++]
  if (headData === this.deque[this.headD]) 
    delete this.deque[this.headD++]
  

  return headData
;

// 检测双端队列 deque 是否为空
MaxQueue.prototype.isEmptyDeque = function() 
  return this.countD - this.headD === 0
;

// 检测双端队列 queue 是否为空
MaxQueue.prototype.isEmptyQuque = function() 
  return this.countQ - this.headQ === 0
;

1

以上是关于剑指 Offer 59 - II. 队列的最大值的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer59 - II 至 剑指offer 64 题解

剑指offer59 - II 至 剑指offer 64 题解

剑指offer(59)-II

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

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

每日一题 - 剑指 Offer 59 - II. 队列的最大值