题目
题解
K神详细题解:剑指 Offer 59 - II. 队列的最大值(单调双向队列,清晰图解)
队列的push和pop实现O(1)复杂度使用普通的单向队列就行了、但这个max的求解需要使用到双端队列deque。我们可以使用双端队列实现max的维护、当有新的值进入时把小于新值的元素poll掉,然后再push进去。poll元素时当polld的元素等于当前deque的队首时要poll掉维护最大值的元素。
deque的使用:java关于Deque的使用
class MaxQueue {
Queue<Integer> queue;
Deque<Integer> deque;
public MaxQueue() {
queue = new LinkedList<>();
deque = new ArrayDeque<>();
}
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.offer(value);
}
public int pop_front() {
if (queue.isEmpty()){
return -1;
}
if (queue.peek().equals(deque.peekFirst())){
deque.pollFirst();
}
return queue.poll();
}
}