题目来源
解题方法
一个queue+一个deque
思路:维护一个递减的deque,队首元素为最大值,每当push_back时,移除deque中比此时要加入的元素小的元素,原因是max_value需要最大值,只要当前最大的元素不走,比他小的元素是没有机会的,而用queue来维护一个正常的队列,妙处在于被淘汰的元素都在最大元素之前加入队列,因此只要被淘汰元素不走完,最大元素是不会走的,直接看代码
附上代码
class MaxQueue {
public:
deque<int> deque;
queue<int> queue;
MaxQueue() {
}
int max_value() {
if(deque.empty())
return -1;
return deque.front();
}
void push_back(int value) {
while(!deque.empty() && value > deque.back())
deque.pop_back();
queue.push(value);
deque.push_back(value);
}
int pop_front() {
if(queue.empty())
return -1;
int ans = queue.front();
if(ans == deque.front())
deque.pop_front();
queue.pop();
return ans;
}
};
/**
* 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();
*/