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

和上一道题差不多的思想,利用辅助双端队列队首存储最值。

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

class MaxQueue {

    Deque<Integer> A;
    Deque<Integer> B;
    public MaxQueue() {
        A = new LinkedList<>();
        B = new LinkedList<>();
    }
    
    public int max_value() {
        return B.isEmpty() ? -1 : B.peekFirst();
    }
    
    //A维护正常队列,B队首存储最值
    public void push_back(int value) {
        A.offerLast(value);
        //将双向队列中队尾 所有 小于 value 的元素弹出(以保持 deque 非单调递减)
        while(!B.isEmpty() && B.peekLast() < value)
            B.pollLast();
        B.offerLast(value);
    }
    
    public int pop_front() {
        if(A.isEmpty())
            return -1;
        //若A首元素和B首元素 相等 ,则将B首元素出队
        if(A.peekFirst().equals(B.peekFirst()))
            B.pollFirst();
        return A.pollFirst();
    }
}

/**
 * Your MaxQueue object will be instantiated and called as such:
 * MaxQueue obj = new MaxQueue();
 * int param_1 = obj.max_value();
 * obj.push_back(value);
 * int param_3 = obj.pop_front();
 */

 

posted @ 2021-03-27 17:51  星予  阅读(29)  评论(0编辑  收藏  举报