请设计一个自助结账系统,该系统需要通过一个队列来模拟顾客通过购物车的结算过程,需要实现的功能有:
get_max():获取结算商品中的最高价格,如果队列为空,则返回 -1
add(value):将价格为 value 的商品加入待结算商品队列的尾部
remove():移除第一个待结算的商品价格,如果队列为空,则返回 -1
注意,为保证该系统运转高效性,以上函数的均摊时间复杂度均为 O(1)
示例 1:
输入:
["Checkout","add","add","get_max","remove","get_max"]
[[],[4],[7],[],[],[]]
输出: [null,null,null,7,4,7]
示例 2:
输入:
["Checkout","remove","get_max"]
[[],[],[]]
输出: [null,-1,-1]
提示:
1 <= get_max, add, remove 的总操作数 <= 10000
1 <= value <= 10^5
代码
csharp
class Checkout {
public:
queue<int> q;
deque<int> d;
Checkout() {
}
int get_max() {
if(d.empty()){
return -1;
}
return d.front();
}
void add(int value) {
while(!d.empty() && d.back() < value){
d.pop_back();
}
d.push_back(value);
q.push(value);
}
int remove() {
if(q.empty()){
return -1;
}
int ans = q.front();
if(ans == d.front()){
d.pop_front();
}
q.pop();
return ans;
}
};
这道题难度不大,我们只需要定义一个普通的队列来找到第一个未结算的商品,然后定义一个单调递减的双端序列用队头元素来表示获取结算商品中的最高价格即可。