LeetCode 716. 最大栈(双栈 / list+map)
文章目录
- 1. 题目
- 2. 解题
- 2.1 双栈解法
- 2.2 list+map
1. 题目
设计一个最大栈,支持 push、pop、top、peekMax 和 popMax 操作。
push(x) -- 将元素 x 压入栈中。
pop() -- 移除栈顶元素并返回这个值。
top() -- 返回栈顶元素。
peekMax() -- 返回栈中最大元素。
popMax() -- 返回栈中最大的元素,并将其删除。如果有多个最大元素,只要删除最靠近栈顶的那个。样例 1:
MaxStack stack = new MaxStack();
stack.push(5);
stack.push(1);
stack.push(5);
stack.top(); -> 5
stack.popMax(); -> 5
stack.top(); -> 1
stack.peekMax(); -> 5
stack.pop(); -> 1
stack.top(); -> 5注释:
-1e7 <= x <= 1e7
操作次数不会超过 10000。
当栈为空的时候不会出现后四个操作。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/max-stack
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
类似题目:LeetCode 155. 最小栈
2.1 双栈解法
- 同时插入数值,和最大值
- 当要删除最大的值的时候,要将不是最大值的数,先存入临时栈,后序再挪回来,最坏时间复杂度O(n)
class MaxStack {int maxelem = INT_MIN;stack<int> s;stack<int> temp;int v, m;
public:/** initialize your data structure here. */MaxStack() {}void push(int x) {maxelem = max(maxelem, x);s.push(x);s.push(maxelem);}int pop() {s.pop();v = s.top();s.pop();maxelem = s.empty() ? INT_MIN : s.top();return v;}int top() {m = s.top();s.pop();v = s.top();s.push(m);return v;}int peekMax() {return s.top();}int popMax() {int ans = s.top();maxelem = s.top();bool flag = true;while(flag){s.pop();if(s.top() != maxelem)temp.push(s.top());elseflag = false;s.pop();}maxelem = s.empty() ? INT_MIN : s.top();while(!temp.empty()){v = temp.top();temp.pop();s.push(v);maxelem = max(maxelem, v);s.push(maxelem);}return ans;}
};
140 ms 32.2 MB
2.2 list+map
- list 当做栈来使用
- map的key为数值,value挂着数值下,对应的list迭代器
- 时间复杂度O(log n)
class MaxStack {list<int> l;map<int, vector<list<int>::iterator>> m;
public:/** initialize your data structure here. */MaxStack() {}void push(int x) {l.push_front(x);m[x].push_back(l.begin());}int pop() {int v = l.front();m[v].pop_back();if(m[v].empty())m.erase(v);l.pop_front();return v;}int top() {return l.front();}int peekMax() {return m.rbegin()->first;}int popMax() {int v = m.rbegin()->first;auto it = m[v].back();m[v].pop_back();if(m[v].empty())m.erase(v);l.erase(it);return v;}
};
240 ms 35.2 MB
长按或扫码关注我的公众号,一起加油、一起学习进步!
LeetCode 716. 最大栈(双栈 / list+map)相关推荐
- [剑指offer][JAVA]面试题第[30]题[包含min函数的栈][双栈辅助栈][单栈]
[问题描述][中等] 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1).示例:MinStack min ...
- 每日写题分享--包含min函数的栈/双栈实现
题目描述: 题目链接:包含min函数的栈 思路: 1.建立两个栈,一个是存储所有数据并可以正常实现push,pop,peek等函数的数据栈stack1,一个是存储stack1非严格降序的辅助栈stac ...
- c语言建立栈(顺序栈、双栈和链式栈)
c语言建立栈 顺序存储 栈的顺序存储定义 初始化栈 入栈操作 出栈操作 其余操作 读取栈顶元素 栈中元素个数 栈是否为空 双栈 双栈的顺序存储结构定义 建立双栈 判断栈为空 进栈操作 出栈操作 链式栈 ...
- LeetCode 1472. 设计浏览器历史记录(双栈)
1. 题目 你有一个只支持单个标签页的 浏览器 ,最开始你浏览的网页是 homepage ,你可以访问其他的网站 url ,也可以在浏览历史中后退 steps 步或前进 steps 步. 请你实现 B ...
- LeetCode 341. 扁平化嵌套列表迭代器(双栈)
文章目录 1. 题目 2. 双栈解题 1. 题目 给定一个嵌套的整型列表.设计一个迭代器,使其能够遍历这个整型列表中的所有整数. 列表中的项或者为一个整数,或者是另一个列表. 示例 1: 输入: [[ ...
- LeetCode 103. 二叉树的锯齿形层次遍历(BFS / 双栈)
1. 题目 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7] ...
- 2022-3-31 Leetcode 716.最大栈
1.好像不能用 stack 作为容器 class MaxStack {public:stack<int> maxsk;stack<int> sk;MaxStack() {max ...
- Leetcode刷题笔记:栈与队列篇
基础知识 栈和队列的原理大家应该很熟悉了,队列是先进先出,栈是先进后出. 如图所示: 那么我这里再列出四个关于栈的问题,大家可以思考一下.以下是以C++为例,使用其他编程语言的同学也对应思考一下,自己 ...
- Leetcode224 基本加减计算器-双栈和状态转换
题目 实现一个基本的计算器来计算一个简单的字符串表达式的值. 字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 . 示例 1: 输入: "1 + 1&quo ...
最新文章
- Android 使用adb 命令截图 的方法
- mysql 5.7巡检脚本_mysql自动化巡检脚本生成html报告
- Lua 操作 MongoDB 数据库实例
- 用R做heatmap示例:NBA联盟50位顶级球员的指标表现
- Django从理论到实战(part23)--模板继承
- 黑科技揭秘:百种异常随机注入,专有云为何稳如泰山
- 物联网计算机相关专业吗,物联网工程属于计算机专业吗
- 计算机专业理科二本录取分数线,这7所211理科录取分数线较低,普通考生记得关注,2所有二本招生...
- Android图片加载之初步认识bitmap
- 沉船会有什么_世界六大沉船,最后一艘有40吨财宝!8吨黄金!你眼红了吗?
- python 引入同一路径的类_Python实现Wordcloud生成词云图的示例
- 【转】Jmagick的使用例子
- 编译原理第四章课后题
- java der decode_支付宝进行签名时爆DER input, Integer tag error异常
- 论文阅读:RGCF: Refined Graph Convolution Collaborative Filering with Concise and Expressive Embedding
- c# winform 无边框窗体 移动办法
- java对外接口安全问题_怎么保证对外暴露接口的安全性(调用频率限制)
- kali linux无线驱动安装,Kali Linux 安装WIFI无线网卡驱动:rtl8822bu 教程
- java函数修饰符_Java 函数 面向对象,修饰符,类,构造方法,this
- 成都榆熙电子商务有限公司:拼多多商家如何剖析用户数据?
热门文章
- opencv python教程简书_OpenCV-Python系列二:常用的图像属性
- python3.8 实现鼠标自动移动_“新生报到”!【移动机器人 HD-1500】负载1500kg,实现了重型货物运输的自动化...
- java metric_java版的Metric工具介绍
- python3图片转代码_python3图片转换二进制存入mysql示例代码
- Linux进程全解3——进程概念、进程ID、多进程调度原理
- Linux下WPS自主设置快捷键,电脑wps的word怎么自主设定快捷键
- [Lydsy1805月赛] 对称数
- django 模板继承与重写
- UEditor编辑器第一次赋值失败的解决方法
- Sargable 与 谓语下推 (predicate pushdown) 简介