-
题目:剑指Offer59-Ⅰ.队列的最大值
实现三个O(1)的API; -
思路:
1.用deque维护一个不严格单减队列:
和剑指Offer59-Ⅰ.滑动窗口的最大值思路一样,只不过59-Ⅰ维护的窗口是固定大小,每当窗口右移的时候都要考虑是否要弹出队首,而本题对大小没有限制,只有调用pop_front()API时才需要考虑弹出的是不是队首(最大值)
class MaxQueue {
public:
queue<int> q;
deque<int> dq;
MaxQueue() {}
int max_value() {
if (!dq.empty()) return dq.front();
else return -1;
}
void push_back(int value) {
q.push(value);
while (!dq.empty() && dq.back() < value) dq.pop_back();
dq.push_back(value);
}
int pop_front() {
if (q.empty()) return -1;
int x = q.front();
q.pop();
if (x == dq.front()) dq.pop_front();
return x;
}
};