题目:
解法一:双端队列维护最大值列表
根据题意,需要实现一个返回最大值的函数,因此需要额外的维护一个列表,这个列表中存放的是于队列中剩余个数相匹配的最大元素的列表.要使时间复杂度为O(1),则用一个双端队列来维护最大值列表.(用空间换时间)

具体实现过程:
在插入数据时:如果插入的数据大于双端队列中的部分元素时,将小于插入数据的元素全部出队,然后将要插入的数据入队.
在删除数据时:如果删除的数据与双端对立的队首元素相等,那么在删除队列元素时也要一同将双端队列中的队首元素删除.保证最大值和队列中的一致性
返回当前最大值时: 直接返回双端队列中的队首元素.
代码实现
class MaxQueue {
public:
MaxQueue() {
}
int max_value() {
//返回当前的最大值
if(!myqueue.size())
return -1;
return myDeque.front();
}
void push_back(int value) {
// 队列入队
myqueue.push(value);
// 双端队列 , 从尾删除小于插入元素的值,再尾插
while( !myDeque.empty() && myDeque.back() < value )
myDeque.pop_back();//尾删除
myDeque.push_back(value);
}
int pop_front() {
// 删除时需要考虑 删掉的是不是最大值,若是,也要将当前最大值的元素删掉
if(!myqueue.size())
return -1;
int ans;
if( myqueue.front() == myDeque.front() )
myDeque.pop_front();
ans = myqueue.front();
myqueue.pop();
return ans;
}
private:
queue<int> myqueue;
deque<int> myDeque;
};

874

被折叠的 条评论
为什么被折叠?



