队列的最大值
题目
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。
若队列为空,pop_front 和 max_value 需要返回 -1
思路 维护一个单调的双端队列用于max和插入,一个正常的队列用于删除
在插入每一个元素 value 时,从双端队列尾部依次取出比当前元素 value 小的元素,直到遇到一个比当前元素大的元素 value即可,这样队列将会始终保持单调递减。
删除操作就维持一个正常的队列即可,当需要删除的元素恰好也是双端队列的队头元素时,一起删掉。
C++
class MaxQueue {
queue<int> q;
deque<int> dq;
public:
MaxQueue() {
}
int max_value() {
if(dq.empty())
return -1;
return dq.front();
}
void push_back(int value) {
while(!dq.empty() && dq.back()<value)
dq.pop_back();
dq.push_back(value);
q.push(value);
}
int pop_front() {
if(q.empty())
return -1;
int res = q.front();
if(res == dq.front())
dq.pop_front();
q.pop();
return res;
}
};
/**
* 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();
*/
python
import queue
class MaxQueue:
def __init__(self):
self.queue = queue.Queue()
self.deque = queue.deque()
def max_value(self) -> int:
return self.deque[0] if self.deque else -1
def push_back(self, value: int) -> None:
while self.deque and self.deque[-1] < value:
self.deque.pop()
self.deque.append(value)
self.queue.put(value)
def pop_front(self) -> int:
if not self.deque:
return -1
res = self.queue.get()
if res == self.deque[0]:
self.deque.popleft()
return res
# Your MaxQueue object will be instantiated and called as such:
# obj = MaxQueue()
# param_1 = obj.max_value()
# obj.push_back(value)
# param_3 = obj.pop_front()