題目
請定義一個隊列並實現函數 max_value 得到隊列裏的最大值,要求函數max_value、push_back 和 pop_front 的均攤時間複雜度都是O(1)。
若隊列爲空,pop_front 和 max_value 需要返回 -1。
代碼
Python
import queue
class MaxQueue:
def __init__(self):
self.deq=queue.deque() # 雙端隊列輔助,遞減,存儲極值
self.que=queue.Queue() # 隊列
def max_value(self) -> int:
return self.deq[0] if self.deq else -1 # 雙端隊列隊頭值即最大值
def push_back(self, value: int) -> None:
while self.deq and self.deq[-1]<value: # 保持雙端隊列遞減
self.deq.pop()
self.deq.append(value)
self.que.put(value)
def pop_front(self) -> int:
if not self.deq:
return -1
res=self.que.get()
if res==self.deq[0]: # 同步刪除雙端隊列中的值
self.deq.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()
C++
class MaxQueue {
queue<int> que;
deque<int> deq;
public:
MaxQueue() {
}
int max_value() {
if (deq.empty())
return -1;
return deq.front();
}
void push_back(int value) {
while (!deq.empty() && deq.back()<value) {
deq.pop_back();
}
deq.push_back(value);
que.push(value);
}
int pop_front() {
if (que.empty())
return -1;
int res=que.front();
if (res==deq.front()) {
deq.pop_front();
}
que.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();
*/