方法一:辅助队列
和上一题的思路相同
我们使用一个辅助的双向队列进行保存最大值
对于他原来的数据插入以及弹出都保持不变
但是我们需要对于有新的数据插入或者数据弹出的话
需要使用一个队列保存我们的最大值
- 插入得时候
我们需要把新插入的数与队尾一个一个比较,如果大于队尾的话,则把所有在队列中小于新插入数的数全部弹出。
最后把我们新插入的数插入进去 - 弹出的时候
我们需要因为是front,我们需要把原来队列的数据进行保存
然后把原来的队列的队首进行pop
然后判断我们的当前原来队列的对手和我们的最大值的队首是否相等
如果不相等则没有必要把我们维持的最大队列的队首的最大值进行pop,如果相等的话,同理我们的辅助存放最大值的队列也需要pop
class MaxQueue {
public:
MaxQueue() {
}
int max_value() {
return max_deque.empty() ? -1 : max_deque.front();
}
void push_back(int value) {
//利用deque 把新插入的数与双向队列的队尾比较
while( !max_deque.empty() && value >= max_deque.back() )
max_deque.pop_back();
queue.push(value);
max_deque.push_back(value);
}
int pop_front() {
if( queue.empty() )
return -1;
int topValue = queue.front();
queue.pop();
if( max_deque.front() == topValue && !max_deque.empty() )
max_deque.pop_front();
return topValue;
}
private:
queue<int> queue;
deque<int> max_deque;
};
/**
* 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();
*/