請定義一個隊列並實現函數 max_value 得到隊列裏的最大值,要求函數max_value、push_back 和 pop_front 的均攤時間複雜度都是O(1)。
若隊列爲空,pop_front 和 max_value 需要返回 -1
示例 1:
輸入:
["MaxQueue","push_back","push_back","max_value","pop_front","max_value"]
[[],[1],[2],[],[],[]]
輸出: [null,null,null,2,1,2]
示例 2:
輸入:
["MaxQueue","pop_front","max_value"]
[[],[],[]]
輸出: [null,-1,-1]
限制:
1 <= push_back,pop_front,max_value的總操作數 <= 10000
1 <= value <= 10^5
template<typename T>
void finsert(vector<T>&v,int id,T x)
{
if(id<0||id>v.size())return;
if(id==v.size())v.push_back(x);
v[id]=x;
}
class MaxQueue {
public:
queue<int>q;
vector<int>v;
int vlen;
MaxQueue() {
vlen=0;
}
int max_value() {
if(q.empty())return -1;
return v[0];
}
void push_back(int value) {
q.push(value);
bool flag=true;
for(int i=vlen;flag && i>0;i--)
{
if(value<=v[i-1])
{
finsert(v,i,value);
vlen=i+1;
flag=false;
}
}
if(flag)
{
finsert(v,0,value);
vlen=1;
}
}
int pop_front() {
if(q.empty())return -1;
int ans=q.front();
q.pop();
if(v[0]==ans)
{
v.erase(v.begin());
vlen--;
}
return ans;
}
};