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

发布时间 2023-04-26 10:19:18作者: 梦想是能睡八小时的猪

【题目】

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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/dui-lie-de-zui-da-zhi-lcof

【思路】

维护一个递减队列,显示最大值直接返回队列头,出队时如果出的是最大值同步更新。

【代码】

class MaxQueue {
    Queue<Integer> que;
    Deque<Integer> deq;
    public MaxQueue() {
        que = new LinkedList<>();
        deq = new LinkedList<>();

    }
    

    public int max_value() {
        return deq.isEmpty()?-1:deq.peekFirst();

    }
    

    public void push_back(int value) {
        que.offer(value);
        while(!deq.isEmpty()&&deq.peekLast()<value){
            deq.removeLast();
        }
        deq.addLast(value);

    }
    

    public int pop_front() {
        if(que.isEmpty()) return -1;
        // 如果出去的就是最大值,更新一下递减队列的情况
        if(que.peek().equals(deq.peekFirst())){
            deq.pollFirst();
        }
        // 否则不用更新,因为中间值会在次大值出去之前就出去了,比如3 -1 -3 5 3 ,当出去5的时候,-1 和-3 早就出去了,只有后面的值会有影响。
        return que.poll();

    }
}