Loading

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

题目

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

思路1(单调队列)

  • 剑指 Offer 59 - I. 滑动窗口的最大值基本一样,我们使用两个队列来解决问题:一个普通的队列,用于正常的队列操作;一个双端队列,这个队列是用来存储队列中的最大值的

代码

class MaxQueue {

    Deque<Integer> deque;
    Queue<Integer> queue;

    public MaxQueue() {
        deque = new LinkedList<>();
        queue = new LinkedList<>();
    }
    
    public int max_value() {
        // 双端队列的队首就是当前队列的最大值
        if (deque.isEmpty()) {
            return -1;
        } else {
            return deque.peekFirst();
        }
    }
    
    public void push_back(int value) {
        // 首先要先正常添加到普通队列中
        queue.offer(value);
        // 然后将value和双端队列的末尾元素进行比较,不断吧小雨value的值删除掉,然后找到第一个小于队尾元素的位置插入进去,如果没有就直接插入
        while (!deque.isEmpty() && deque.peekLast() < value) {
            deque.pollLast();
        }
        deque.offerLast(value);
    }
    
    public int pop_front() {
        if (queue.isEmpty()) {
            return -1;
        } else {
            // 弹出队列头的元素
            int value = queue.poll();
            // 弹出的时候还要比较该元素是不是队列中的最大值,如果是的话,就将它从双端队列中删除,然后第二大的元素成为队头(即此时队列中的最大值)
            if (value == deque.peekFirst()) {
                deque.pollFirst();
            }
            return value;
        }
    }
}

复杂度分析

  • 时间复杂度:\(O(1)\),插入、删除、获取最大值只需要\(O(1)\)时间复杂度即可
  • 空间复杂度:\(O(N)\),存储队列需要用到的空间
posted @ 2021-11-10 00:15  linzeliang  阅读(63)  评论(0)    收藏  举报