题目链接:点击打开链接
题目大意:略。
解题思路:插入操作虽然看起来有循环,做一个插入操作时最多可能会有 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; } };