思路分析:
这个题,我们需要单调队列来维护当前的最大值,达到O(1)的时间复杂度,同时使用一个数组记录当前出现的元素
get_max就返回队头即可, add就在加入之前删除掉所有小于他的元素即可,等于的元素应该放在不删除.不然就会提前出现-1
而remove会比较有趣,他每次是返回数组的当前元素,而且如果这个元素等于队头,那么说明单调队列要pop_front(), 而且dq里面的元素是vector里面的元素的子序列,所以每次删除一定是正确的
代码如下:
class Checkout {
public:
deque<int> dq;
vector<int> v;
int count=0;
Checkout() {
}
int get_max() {
if(!v.empty() && count<v.size()){
return dq.front();
}else{
return -1;
}
}
void add(int value) {
v.push_back(value);
while(!dq.empty() && value>dq.back()){
dq.pop_back();
}
dq.push_back(value);
}
int remove() {
if(!v.empty() && count<v.size()){
if(v[count]==dq.front()) dq.pop_front();
//dq里面的元素也都是按照 add(val)的顺序排列的
//v 里面的元素也都是按照 add(val)的顺序排列的
//而且dq里面的元素 是 v里面元素的子集
//所以dq一定会被正确pop
return v[count++];
}else return -1;
}
};
/**
* 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();
*/