题目描述:
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。
若队列为空,pop_front 和 max_value 需要返回 -1
思路分析:
- 用双端队列存储队列里元素的最大值
- 入队时,如果入队的值大于双端队列队尾的值,则一直出队,最后将值入队
- 出队时,如果队列出队值和双端队列对头元素值相同则双端队列亦出队,否则不出
class MaxQueue {
Queue<Integer> q;
Deque<Integer> qq;
public MaxQueue() {
q=new LinkedList<>();
qq=new LinkedList<>();
}
public int max_value() {
if(qq.isEmpty()){
return -1;
}else{
return qq.peek();
}
}
public void push_back(int value) {
q.offer(value);
while(qq.size()>0&&qq.peekLast()<value){
qq.pollLast();
}
qq.offer(value);
}
public int pop_front() {
int tmp=q.size()>0?q.poll():-1;
if(qq.size()>0&&tmp==qq.peek()){
qq.poll();
}
return tmp;
}
}