题目描述:
分析:用两个队列来实现以上功能,队列q1进行正常的push和pop操作,队列q2用来存储最大值。
其中q2为单调队列,每次插入新元素时,都把单调队列中的所有小于该值的数字删除,来保持单调队列的单调性。
具体可以参考:
https://leetcode-cn.com/problems/dui-lie-de-zui-da-zhi-lcof/solution/mian-shi-ti-59-ii-dui-lie-de-zui-da-zhi-by-leetcod/
代码如下:
class MaxQueue {
public:
// q1正常存储数字
queue<int> q1;
// q2维持一个单调队列,保存最大值
deque<int> q2;
MaxQueue() {
}
int max_value() {
// 如果q1或者q2为空,返回-1
if(q1.empty()||q2.empty())
return -1;
else
// 否则的话,q2的首元素就是当前队列的最大值
return q2.front();
}
void push_back(int value) {
// q1正常插入数字
q1.push(value);
// 每当插入一个新元素时,都把单调队列q2中所有比该元素小的数字都删除
while(!q2.empty()&&q2.back()<value)
q2.pop_back();
// 在q2最后加入value
q2.push_back(value);
}
int pop_front() {
// 如果q1为空,那么返回-1
if(q1.empty())
return -1;
// 记录下q1的首元素
int temp=q1.front();
// 弹出q1的首元素
q1.pop();
// 如果弹出的q1首元素也是q2的首元素,那么q2中该元素也弹出
if(temp==q2.front())
q2.pop_front();
// 返回该弹出值
return temp;
}
};
/**
* 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();
*/