https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/
思路:普通功能用
q
u
e
u
e
queue
queue就可以实现,怎么做到均摊
O
(
1
)
O(1)
O(1)求最大值呢?我们考虑用
d
e
q
u
e
deque
deque维护一个单调非升的双端队列,为什么要用
d
e
q
u
e
deque
deque?因为当我们向队尾插入一个新的元素时,为了维护
d
e
q
u
e
deque
deque的单调性,我们需要拿新元素的值不断的和
d
e
q
u
e
deque
deque的队尾进行比较,并进行
p
o
p
_
b
a
c
k
pop\_back
pop_back操作,所以我们需要
d
e
q
u
e
deque
deque来实现。这样最大值就在
d
e
q
u
e
deque
deque的头部了,由于任意一个元素最多在
q
u
e
u
e
、
d
e
q
u
e
queue、deque
queue、deque中入队一次、出队一次,所以均摊复杂度是
O
(
1
)
O(1)
O(1)的。
class MaxQueue {
public:
queue<int> q;
deque<int> d;
MaxQueue() {
}
int max_value() {
if(d.empty())
return -1;
return d.front();
}
void push_back(int value) {
q.push(value);
if(d.empty()||value<=d.back())
d.push_back(value);
else
{
while(!d.empty()&&value>d.back())
d.pop_back();
d.push_back(value);
}
}
int pop_front() {
if(q.empty())
return -1;
int ans=q.front();
q.pop();
if(ans==d.front())
d.pop_front();
return ans;
}
};
/**
* Your MaxQueue object will be instantiated and called as such:
* MaxQueue* obj = new MaxQueue();
* int param_1 = obj->max_value();
* obj->push_back(value);
* int param_3 = obj->pop_front();
*/