力扣2-队列的最大值
程序员文章站
2022-07-14 18:07:45
...
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的时间复杂度都是O(1)。
若队列为空,pop_front 和 max_value 需要返回 -1
deque 即双端队列,是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。
- push_front(const T& x):双端队列头部增加一个元素X
- push_back(const T& x):双端队列尾部增加一个元素x
- pop_front():删除双端队列中最前一个元素
- pop_back():删除双端队列中最后一个元素
- front():返回首元素的引用
- back():返回尾元素的引用
queue队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。
- front():返回 queue 中第一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue为空,返回值是未定义的。
- back():返回 queue 中最后一个元素的引用。如果 queue 是常量,就返回一个常引用;如果 queue为空,返回值是未定义的。
- push(const T& obj):在 queue 的尾部添加一个元素的副本。这是通过调用底层容器的成员函数 push_back()来完成的。
- push(T&& obj):以移动的方式在 queue 的尾部添加元素。这是通过调用底层容器的具有右值引用参数的成员函数push_back() 来完成的。
- pop():删除 queue 中的第一个元素。
- size():返回 queue 中元素的个数。
- empty():如果 queue 中没有元素的话,返回 true。
方法:维护一个单调的双端队列
- 用一个队列保存正常元素,另一个双向队列保存单调递减的元素
- 入栈时,第一个队列正常入栈;第二个队列是递减队列,所以需要与之前的比较,从尾部把小于当前value的全部删除(因为用不到了)
- 出栈时,第一个队列正常出栈;第二个队列的头部与出栈的值作比较,如果相同,那么一起出栈
可能有人有这样的疑问:假设最后加入队列的是最大的数,那么deque里的数就只剩最后一个了,要是这个时候poll,再访问最大的数,deque就空了啊?这个最大值查找不就只能用一次了?
因为队列是先入先出,最后加入的最大的数,肯定是最后才会弹出的。
class MaxQueue {
public:
queue<int> q;
deque<int> d;
MaxQueue() {
}
int max_value() {
if(q.empty())
return -1;
else
return d.front();
}
void push_back(int value) {
while(!d.empty()&&d.back()<value)
d.pop_back();
d.push_back(value);
return q.push(value);
}
int pop_front() {
if (q.empty())
return -1;
int ans = q.front();
if (ans == d.front()) {
d.pop_front();
}
q.pop();
return ans;
}
};
上一篇: 【Android】spinner下拉框
推荐阅读
-
剑指offer之队列中的最大值(C++/Java双重实现)
-
力扣刷题笔记:1052.爱生气的书店老板(普通滑窗题,巧妙利用grumpy[i]的0、1值作为flag计算满意顾客人数)
-
力扣题目汇总(机器人返回原点,按奇偶排序,数字的补数)
-
力扣OJ 剑指 Offer 68 - II. 236. 二叉树的最近公共祖先
-
算法源于生活,算法服务于生活---在力扣的成长(一)
-
力扣121. 买卖股票的最佳时机(动态规划)
-
数据结构与算法 力扣83.删除排序链表的重复元素
-
程序员代码面试指南 python实现(第一章 栈和队列 :最大值减去最小值小于或等于num的子数组数量)
-
力扣题目——有效的括号(java版)
-
力扣2-队列的最大值