解法:
思想:
本质是求滑动窗口最大值的问题。队列可以看成是一个滑动窗口,入队就是将窗口的右边界右移,出队就是将窗口的左边界右移。
复杂度:
操作均摊都是O(1)
代码:
class MaxQueue {
public:
//正常的队列
queue<int>queue;
//非严格递减的双端队列,头部就是最大值
deque<int>deque;
MaxQueue() {
}
int max_value() {
if(queue.empty())
return -1;
return deque.front();
}
void push_back(int value) {
queue.push(value);
//从尾部插入,将小于value的全部弹出,维持非严格递减。最后插入
while(!deque.empty() && deque.back() < value)
deque.pop_back();
deque.push_back(value);
}
//如果要pop的值是deque的队首元素,那么deque要pop_front()
int pop_front() {
if(queue.empty())
return -1;
int ret = queue.front();
if(ret == deque.front())
deque.pop_front();
queue.pop();
return ret;
}
};