题目链接
剑指 Offer 59 - II. 队列的最大值
思路分析
- 首先需要明确的是,我们的max_value是用来得到队列中的最大值的,所以我们max_value返回的一定是队头元素,那么如果我们新入队的数变为当前队列的最大值的话,我么就要更新最大值队列
- 例如 入队顺序为2 3 5,那么当5入队后,其前面的2 3就没有意义了,因此需要将他们出队
- 想要将他们出队,就一定要从尾部开始判断,因此我们需要尾删,所以也决定了我们要使用deque的数据结构
- 当数据出队时,如果当前队头元素和我们存储最大值队列的队头元素相等时,此时两者都需要出队
代码实现
class MaxQueue {
public:
queue<int> q;
deque<int> d;
MaxQueue() {
}
int max_value() {
return d.empty() ? -1 : d.front();
}
void push_back(int value) {
while(!d.empty() && d.back() < value)
d.pop_back();
q.push(value);
d.push_back(value);
}
int pop_front() {
if(q.empty())
return -1;
int val = q.front();
if(val == d.front())
d.pop_front();
q.pop();
return val;
}
};