剑指 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()
*/