题目
请定义一个队列并实现函数 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]
解题
方法一:单调双向队列来辅助
定义一个queue,为正常队列
定义一个deque,为辅助双向队列,通过它的队列头部来存储最大的值。
while(!deque.empty()&&value>deque.back()){ deque.pop_back(); }
上面这样子写,可以使得,相同的元素,重复加入,可以防止出现,queue不空,deque为空的情况。
综上,不会出现queue不为空,deque为空的情况
class MaxQueue { public: queue<int> queue; deque<int> deque; MaxQueue() { } int max_value() { if(deque.empty()) return -1;//题目要求 return deque.front(); } void push_back(int value) { //当值大于deque尾的元素,就弹出 while(!deque.empty()&&value>deque.back()){ deque.pop_back(); } deque.push_back(value); queue.push(value); } int pop_front() { if(deque.empty()) return -1;//题目要求 int num=queue.front(); if(deque.front()==num){//如果要弹出的元素和deque的头元素一致,就弹出。 deque.pop_front(); } queue.pop(); return num; } };