【单调队列】维护一个单调队列来确定最大值。举个🌰
3 4 5 1 2 3 6 这样入队列:
3入的时候,max队列中入3
4入的时候,我们发现,此时的3已经对后面完全不起作用了,因为有4挡着,而且4出队列的时候3其实早就已经出来了,同理,如果max中还有比4小的也是同样不起作用,所以可以从后向前遍历max队列,把比4小的都出队,把4入队
5入队同理,此时max队伍里只有5
1入队的时候要注意,max中要从后面加上1,因为一旦5出队列,那么剩下的最大的就是1了
2入队的时候,从后往前检查max,把1丢掉,max中剩下5,2,这样的话5即使出队列,1也比2小,剩下的最大值还是2
3入队同理,max变成了5,3
6入队的时候,max只剩6了,因为前面这一堆出不出队列,当前的最大值都是6了。
class MaxQueue {
public Deque<Integer> queue = new LinkedList();
public Deque<Integer> max = new LinkedList();
public MaxQueue() {
}
public int max_value() {
if(queue.isEmpty()) return -1;
return max.peek();
}
public void push_back(int value) {
queue.offer(value);
while(!max.isEmpty() && max.peekLast() < value) max.pollLast();
max.offer(value);
}
public int pop_front() {
if(queue.isEmpty()) return -1;
int value = queue.poll();
if(max.peek() == value) max.poll();
return value;
}
}