思路
首先实现一个队列不难。直接调用现成的库类就行。
但是要实时的记录max就不容易,因为当你记录的最大值poll出去的时候,你不知道当前的最大值是哪个。
所以就想到记录一个一下最大值的双端队列。
4 2 0 3
最大值: 4
最大值 : 4 2
最大值: 4 2 0
最大值: 4 3 因为 4出去以后 2,0出不出去不影响最大值。
public class MaxQueue {
Deque<Integer> queue;
Deque<Integer> hepler;
public MaxQueue() {
queue = new ArrayDeque<>();
hepler = new ArrayDeque<>();
}
public int max_value() {
if (queue.isEmpty()){
return -1;
}
return hepler.peekFirst();
}
public void push_back(int value) {
queue.addLast(value);
while (!hepler.isEmpty() && value > hepler.peekLast()){
hepler.pollLast();
}
hepler.addLast(value);
}
public int pop_front() {
if (queue.isEmpty()){
return -1;
}
int temp = queue.pollFirst();
if (temp == hepler.peekFirst()){
hepler.pop();
}
return temp;
}
public static void main(String[] args) {
MaxQueue maxQueue = new MaxQueue();
maxQueue.push_back(1);
maxQueue.push_back(2);
System.out.println(maxQueue.max_value());
System.out.println(maxQueue.pop_front());
System.out.println(maxQueue.max_value());
}
}