队列的最大值
[题目链接][https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/]
额外维护一个单调队列(双端队列):
1. max_value: max_q为空返回-1,不空返回对头元素
2. push_back: value入队,判断value是否大于当前队尾元素,如果大于,一直出队;最后将该元素入队;
3. pop_front:如果队列q为空,返回-1,否则判断要出队的元素是不是队列的最大值,如果是max_q与q都出队。
class MaxQueue {
public:
queue<int> q;
deque<int> max_q;
MaxQueue() {
max_q.push_back(-1);
}
int max_value() {
if(!max_q.empty()) return max_q.front();
else return -1;
}
void push_back(int value) {
q.push(value);
while(!max_q.empty() && value >= max_q.back())
{
max_q.pop_back();
}
max_q.push_back(value);
}
int pop_front() {
if(q.empty()) return -1;
int x = q.front();
if(x == max_q.front() && !max_q.empty()) max_q.pop_front();
q.pop();
return x;
}
};
/**
* 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();
*/