题目在这 解题思路: 有一个普通队列和最大值队列,维护这个最大值队列。 pop_front():如果普通队列不为空,弹出队首的值;如果最大值队列的队首值与该值相等,弹出最大值队列的队首。 push_back(int value):将value直接入普通队列。如果最大值队列为空,将value直接入最大值队列;如果value大于最大值队列队尾的值,弹出最大值队列队尾的值,直到该队列队尾的值大于value,将value入队列;如果value小于最大值队列队尾的值,将value直接入队列。 max_value():如果最大值队列为空,返回-1;否则返回队首的值。
class MaxQueue { Queue<Integer> queue; Deque<Integer> maxQueue; public MaxQueue(){ queue = new LinkedList<>(); maxQueue = new ArrayDeque<>(); } public void push_back(int value){ queue.offer(value); if (maxQueue.isEmpty()){ maxQueue.offerLast(value); }else if (value > maxQueue.peekLast()){ while (!maxQueue.isEmpty()&&value > maxQueue.peekLast()){ maxQueue.pollLast(); } maxQueue.offerLast(value); }else { maxQueue.offerLast(value); } } public int pop_front() { if (queue.isEmpty())return -1; int res = queue.poll(); if (!maxQueue.isEmpty() && res == maxQueue.peekFirst()){ maxQueue.pollFirst(); } return res; } public int max_value(){ if (maxQueue.isEmpty())return -1; else return maxQueue.getFirst(); } }