题目
LCR 184. 设计自助结算系统
设计一个自助结账系统,该系统需要通过一个队列来模拟顾客通过购物车的结算过程,需要实现的功能有:
get_max()
:获取结算商品中的最高价格,如果队列为空,则返回 -1add(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
解法:
- 这题要求函数的均摊时间复杂度均为 O(1),也是通过维护一个单调队列实现的
- 具体见[LeetCode][239]【学习日记】滑动窗口最大值——O(n)单调队列
class Checkout {queue<int> q;//主队列deque<int> maxQ;//维护了主队列中最大值右侧的单调递减队列
public:Checkout() {}int get_max() {if(q.empty()) return -1;return maxQ.front();}void add(int value) {q.push(value);while(!maxQ.empty() && value>maxQ.back()) maxQ.pop_back();maxQ.push_back(value);}int remove() {if(q.empty()) return -1;int val = q.front();q.pop();if(val==maxQ.front()) maxQ.pop_front();return val;}
};/*** Your Checkout object will be instantiated and called as such:* Checkout* obj = new Checkout();* int param_1 = obj->get_max();* obj->add(value);* int param_3 = obj->remove();*/