思路要点
1.需要一个队列(queue)和一个双端队列(Deque),queue用来实现正常的队列功能,Deque用来保存区间的最大值。
2.Deque的队列头保存的是当前队列的最大值,之后的元素是当最大值出队列后剩余区间的最大值,以此类推。
3.当元素(简称V)入队列时,双端队列中元素值小于V时,出队列,因为当元素V入队列时,小于V的元素都不会是最大值,且当这些小于V的元素出队列时也不影响当前队列的最大值,所以应该出队列,但应该在队列尾部出,所以使用双端队列。
class MaxQueue {
Queue<Integer> q;
Deque<Integer> d;
public MaxQueue() {
q = new LinkedList<>();
d = new LinkedList<>();
}
public int max_value() {
if(d.isEmpty()){
return -1;
}
return d.peekFirst(); //peek只是取最大值不需要删除
}
public void push_back(int value) {
while(!d.isEmpty() && d.peekLast() < value){
d.pollLast();
}
d.offerLast(value); //存放当前不在d中的一个区间最大值
q.offer(value);
}
public int pop_front() {
if(q.isEmpty()){
return -1;
}
int ans = q.poll();
if(d.peekFirst() == ans){
d.pollFirst();
}
return ans;
}
}