输入:
要求:按要求实现get_max()、add(value)、remove()三个函数
输出:
思路:普通队列搭配双端队列使用,维护一个单调递减的双端队列。
普通队列 q 用来正常入队/出队。
为了高效获得最大值,需要维护一个单调递减的双端队列qmax。
-
当执行
add(value):-
先把 qmax 里所有比 value小的尾部元素全部弹掉
(因为它们永远不可能成为最大值) -
再把 value 加到 qmax 的尾部
-
-
当执行
remove():-
如果移除的元素刚好等于 qmax 的队头,qmax 也要同步弹掉队头。
-
这样就能保证:
-
qmax 的队头永远是当前队列最大值
复杂度:
时间复杂度:O(1)
空间复杂度:O(n)
class Checkout {
private:
queue<int> q;
deque<int> qmax;
public:
Checkout() {
}
int get_max() {
if (q.empty()) {
return -1;
}
return qmax.front();
}
void add(int value) {
q.push(value);
while (!qmax.empty() && qmax.back() < value) {
qmax.pop_back();
}
qmax.push_back(value);
}
int remove() {
if (q.empty()) {
return -1;
}
if (q.front() == qmax.front()) {
qmax.pop_front();
}
int ans = q.front();
q.pop();
return ans;
}
};
446

被折叠的 条评论
为什么被折叠?



