这题非常经典。与栈的最大值不同,队列由于每次出队列的是首部的数,所以维护前i个值的最大值明显无法满足O(1).
这题的巧妙之处在于,维护一个单调递减的数列。因为当出现一个新的最大值时,前面的数已经没有用了。现在即使删除前面的数,最大值还是不变的。所以维护单调递减的数列,每次取最前面的数,就是队列的最大值。
class MaxQueue {
queue<int> que;
deque<int> dp;
public:
MaxQueue() {
}
int max_value() {
if(que.size()==0)
{
return -1;
}
else
{
return dp.front();
}
}
void push_back(int value) {
if(que.size()==0)
{
que.push(value);
dp.push_back(value);
}
else
{
while(dp.size()>0&&dp.back()<=value)
{
dp.pop_back();
}
dp.push_back(value);
que.push(value);
}
}
int pop_front() {
if(que.size()==0)
{
return -1;
}
else
{
int tmp=que.front();
if(tmp==dp.front())
{
dp.pop_front();
}
que.pop();
return tmp;
}
}
};
/**
* Your MaxQueue object will be instantiated and called as such:
* MaxQueue* obj = new MaxQueue();
* int param_1 = obj->max_value();
* obj->push_back(value);
* int param_3 = obj->pop_front();
*/