题目链接:点击打开链接
题目大意:略。
解题思路:插入操作虽然看起来有循环,做一个插入操作时最多可能会有 n 次出队操作。但要注意,由于每个数字只会出队一次,因此对于所有的 n 个数字的插入过程,对应的所有出队操作也不会大于 n 次。因此将出队的时间均摊到每个插入操作上,时间复杂度为 O(1)【注意题目说的是“均摊”,而不是最差情况】。
相关企业
- 字节跳动
 
AC 代码
- Java
 
// 解决方案(1)
class MaxQueue {
    Queue<Integer> queue;
    Deque<Integer> deque;
    public MaxQueue() {
        queue = new LinkedList<>();
        deque = new LinkedList<>();
    }
    public int max_value() {
        return deque.isEmpty() ? -1 : deque.peekFirst();
    }
    public void push_back(int value) {
        queue.offer(value);
        while(!deque.isEmpty() && deque.peekLast() < value)
            deque.pollLast();
        deque.offerLast(value);
    }
    public int pop_front() {
        if(queue.isEmpty()) return -1;
        if(queue.peek().equals(deque.peekFirst()))
            deque.pollFirst();
        return queue.poll();
    }
}
// 解决方案(2)
class MaxQueue {
    int[] data = new int[10000];
    int[] order = new int[10000];
    int dHead = -1;
    int dTail = -1;
    int oHead = 0;
    int oTail = -1;
    public MaxQueue() {
    }
    
    public int max_value() {
        return order[oHead] == 0 ? -1 : order[oHead];
    }
    
    public void push_back(int value) {
        data[++dTail] = value;
        while (-1 != oTail && order[oTail] != 0 && order[oTail] < value) {
            order[oTail--] = 0;
        }
        order[++oTail] = value;
    }
    
    public int pop_front() {
        if (dTail == dHead) {
            return -1;
        }
        int res = data[++dHead];
        if (res == order[oHead]) {
            order[oHead++] = 0;
        }
        data[dHead] = 0;
        return res;
    }
}- C++
 
class MaxQueue {
    queue<int> que;
    deque<int> deq;
public:
    MaxQueue() { }
    int max_value() {
        return deq.empty() ? -1 : deq.front();
    }
    void push_back(int value) {
        que.push(value);
        while(!deq.empty() && deq.back() < value)
            deq.pop_back();
        deq.push_back(value);
    }
    int pop_front() {
        if(que.empty()) return -1;
        int val = que.front();
        if(val == deq.front())
            deq.pop_front();
        que.pop();
        return val;
    }
};









