请定义一个队列并实现函数 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]
限制:
1 <= push_back,pop_front,max_value的总操作数 <= 10000
1 <= value <= 10^5
解题思路:
本质上是再类里面维护一个辅助队列,辅助队列维护最大值的滑动窗口。
1.正常队列。用于满足出队,入队操作。
1.辅助队列,队首永远是最大值。(存储队列各个数的地址)
#include
#include
#include
using namespace std;
class MaxQueue {
public:
MaxQueue() {
}
int max_value() {
if (m_deque.empty()) {
return -1;
}
else {
return (*m_assist.front());
}
}
void push_back(int value) {
m_deque.push_back(value);
while (!m_assist.empty() && (*m_assist.back()) < value)
m_assist.pop_back();
m_assist.push_back(m_deque.end()-1);
}
int pop_front() {
if (m_deque.empty()) {
return -1;
}
else {
int front = m_deque.front();
if (m_assist.front() == m_deque.begin()) {
m_assist.pop_front();
}
m_deque.pop_front();
return front;
}
}
private:
deque m_deque; /* 正常队列 */
deque::iterator> m_assist; /* 辅助队列 */
};
/**
* 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();
*/
int main() {
//["MaxQueue", "pop_front", "pop_front", "pop_front", "pop_front", "pop_front", "push_back", "max_value", "push_back", "max_value"]
// [[], [], [], [], [], [], [15], [], [9], []]
//["MaxQueue", "push_back", "push_back", "max_value", "pop_front", "max_value"]
//[[], [1], [2], [], [], []]
//["MaxQueue", "max_value", "pop_front", "pop_front", "push_back", "push_back", "push_back", "pop_front", "push_back", "pop_front"]
//[[], [], [], [], [94], [16], [89], [], [22], []]
//MaxQueue* pm = new MaxQueue();
//cout << pm->pop_front() << endl;
//cout << pm->pop_front() << endl;
//cout << pm->pop_front() << endl;
//cout << pm->pop_front() << endl;
//cout << pm->pop_front() << endl;
//pm->push_back(15);
//cout << pm->max_value() << endl;
//pm->push_back(9);
//cout << pm->max_value() << endl;
//MaxQueue* pm = new MaxQueue();
//pm->push_back(1);
//pm->push_back(2);
//cout << pm->max_value() << endl;
//cout << pm->pop_front() << endl;
//cout << pm->max_value() << endl;
MaxQueue* pm = new MaxQueue();
cout << pm->max_value() << endl;
cout << pm->pop_front() << endl;
cout << pm->pop_front() << endl;
pm->push_back(94);
pm->push_back(16);
pm->push_back(89);
cout << pm->pop_front() << endl;
pm->push_back(22);
cout << pm->pop_front() << endl;
return 0;
}