【剑指Offer】-队列的最大值

题目链接:剑指Offer59 队列的最大值
题目描述:


请定义一个队列并实现函数 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]
 
限制:

1 <= push_back,pop_front,max_value的总操作数 <= 10000
1 <= value <= 10^5

题解:

解题思路:
1.定义MaxQueue数据结构,包含一个原始队列queue,一个单调递减队列maxQueue。
2.进队。queue进队元素,maxQueue将小于当前元素的元素均删除,保持单调递减性。
3.出队。queue正常出队,若当前出队元素等于maxQueue的最大值,则maxQueue出队。
4.获取最大值。取maxQueue的第0个元素即为最大值。

var MaxQueue = function() {
    this.orginQueue = [];    //原始队列
    this.maxQueue = [];     //单调递减队列

};

/**
 * @return {number}
 */
MaxQueue.prototype.max_value = function() {
    return this.maxQueue.length? this.maxQueue[0] : -1;
};

/** 
 * @param {number} value
 * @return {void}
 */
MaxQueue.prototype.push_back = function(value) {
    this.orginQueue.push(value);     //原始队列入队
    //维护单调队列的单调性,队尾开始遍历,遇到值比 value 小的就弹出
    while(this.maxQueue.length && this.maxQueue[this.maxQueue.length - 1] < value) {
        this.maxQueue.pop();
    }
    this.maxQueue.push(value);

};

/**
 * @return {number}
 */
MaxQueue.prototype.pop_front = function() {
    if(!this.orginQueue.length)
        return -1;
    const val = this.orginQueue.shift();
    //同步单调队列与原始队列
    if(val === this.maxQueue[0])
        this.maxQueue.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()
 */

posted @ 2022-03-28 11:55  张宵  阅读(20)  评论(0编辑  收藏  举报