题目描述:
定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。
若队列为空,pop_front 和 max_value 需要返回 -1
题解:
我对于这道题,刚开始看的稍微有点懵,后来才知道是描述的有点问题。
这题主要就是返回当前队列的最大值 push_back()和pop_front()就是两个方法,push_back()用来添加元素,pop_front()弹出元素。
对于这道题,其实可以用一个辅助队列d来完成,d队列保存依次递减的最大值,即首位当前q队列最大值,当q队列弹出最大值的时候,d队列弹出队首元素。具体描述 ,在注释里面更清晰。
class MaxQueue {
Queue<Integer> q;
Deque<Integer> d;
public MaxQueue() {
//q队列正常顺序插入删除元素
q = new LinkedList<Integer>();
//d队列保存最大值 依次递减。
//比如q队列 :1 2 4 2 0 3
//则d队列 :4 3
d = new LinkedList<Integer>();
}
//返回当前q队列的最大值 ;就可以直接返回d队列队首元素
public int max_value() {
if (d.isEmpty()) {
return -1;
}
return d.peekFirst();
}
// push_back(const T& x):双端队列尾部增加一个元素x
//如果新增的元素value比队尾元素大 就把队尾元素删除,直到value比队尾元素小
public void push_back(int value) {
while (!d.isEmpty() && d.peekLast() < value) {
d.pollLast();
}
//d和q两个队列都增加新的值value。
d.offerLast(value);
q.offer(value);
}
//pop_front():删除双端队列中最前一个元素
//pop_front就是弹出q队列队首元素, 如果q队列队首元素和d队列队首元素相同,d队列队首元素弹出。
public int pop_front() {
if (q.isEmpty()) {
return -1;
}
int ans = q.poll();
if (ans == d.peekFirst()) {
d.pollFirst();
}
return ans;
}
}