剑指 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 题解