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


长按或扫码关注我的公众号,一起加油、一起学习进步!
Michael阿明

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475271.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux python命令无反应_Python学习第164课--Linux命令行特殊符号的意义及命令的语法规则...

【每天几分钟&#xff0c;从零入门python编程的世界&#xff01;】这节我们介绍Linux系统命令行中的一些特定的符号具有什么含义&#xff0c;以及命令行的语法规则。●Linux命令行中特定的符号的含义比如我登录到系统中之后&#xff0c;会显示[xiaozhilocalhost~]$这一行符号&a…

Lucene3.5自学4--建索引相关知识总结

Lucene简单介绍&#xff08;该部分摘自网络&#xff09; Lucene是一个高效的&#xff0c;基于Java的全文检索库。 所以在了解Lucene之前要费一番工夫了解一下全文检索。 那么什么叫做全文检索呢&#xff1f;这要从我们生活中的数据说起。 我们生活中的数据总体分为两种&#xf…

LeetCode 734. 句子相似性(哈希)

文章目录1. 题目2. 解题1. 题目 给定两个句子 words1, words2 &#xff08;每个用字符串数组表示&#xff09;&#xff0c;和一个相似单词对的列表 pairs &#xff0c;判断是否两个句子是相似的。 例如&#xff0c;当相似单词对是 pairs [["great", "fine&qu…

jsp 中提交表单后在firefox、chrome 中中文显示为正常,但在IE中中文显示为乱码?...

如题&#xff1a; jsp 中提交表单后在firefox、chrome 中中文显示为正常&#xff0c;但在IE中中文显示为乱码&#xff1f; 备注:框架&#xff1a;spring 和hibernate 提交表单后&#xff0c;在IE中提交的数据传到Controller中进行处理&#xff0c;进行输出获得过来的参数&#…

python导入gif_Python之GIF图倒放,沙雕快乐源泉!我已经笑了一天了!

GIF图现在已经融入了我们的日常网络生活&#xff0c;微信群、QQ群、朋友圈......一言不合就斗图&#xff0c;你怕了吗&#xff1f;不用担心&#xff0c;只要学会了Python之GIF倒放技能&#xff0c;你就是“斗图王”。咱们直接开始本文的内容&#xff01;使用的工具1PIL(Python …

LeetCode 758. 字符串中的加粗单词(Trie树)

文章目录1. 题目2. 解题1. 题目 给定一个关键词集合 words 和一个字符串 S&#xff0c;将所有 S 中出现的关键词加粗。所有在标签 <b> 和 </b> 中的字母都会加粗。 返回的字符串需要使用尽可能少的标签&#xff0c;当然标签应形成有效的组合。 例如&#xff0c;…

博客园配置windows live writer,实现本地代码高亮

你是否还在为只能用浏览器在博客后台写文章而苦恼&#xff1f; 你是否还在纠结于live writer没有代码高亮而苦恼&#xff1f; 现在一切都能解决&#xff1a; 其实博客园支持SyntaxHighlighter代码着色&#xff0c;可以用相应的Live Writer代码着色插件进行代码着色。他们推荐的…

执行计划 分析一条sql语句的效率 mysql_MySQL中一条SQL语句的执行过程

MySQL中一条SQL语句的执行过程发布时间&#xff1a;2018-11-24 18:35,浏览次数&#xff1a;390, 标签&#xff1a;MySQLSQL查询语句的执行顺序&#xff1a;&#xff11;.客户端通过TCP连接发送连接请求到mysql连接器&#xff0c;连接器会对该请求进行权限验证及连接资源分配(ma…

周报_2012第11周(2012/03/11-2012/03/17)

项目&#xff1a;X保密项目 2012.03.12 // Win XP 需要判断取消操作. By lishupeng360.cn 2012/03/12 11:49. if (FileOp.fAnyOperationsAborted) { bRet FALSE; } const int gcn_SEC_DELAY 100; // 等待 HTTP Download 下载线程处理网络数据。 …

LeetCode 246. 中心对称数(哈希)

文章目录1. 题目2. 解题1. 题目 中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字&#xff08;或者上下颠倒地看&#xff09;。 请写一个函数来判断该数字是否是中心对称数&#xff0c;其输入将会以一个字符串的形式来表达数字。 示例 1: 输入: "69&qu…

LeetCode 276. 栅栏涂色(DP)

文章目录1. 题目2. 解题2.1 DP超时解2.2 DP解1. 题目 有 k 种颜色的涂料和一个包含 n 个栅栏柱的栅栏&#xff0c;每个栅栏柱可以用其中一种颜色进行上色。 你需要给所有栅栏柱上色&#xff0c;并且保证其中相邻的栅栏柱 最多连续两个 颜色相同。然后&#xff0c;返回所有有效…

学习编程好榜样

学习编程好榜样 忠于gaming忠于down 代码分明不忘本 逻辑清晰容错强 逻辑清晰容错强 ! 学习编程好榜样 放到哪里哪里run 愿作系统的中间件 开源主义思想放光芒 开源主义思想放光芒! 学习编程好榜样 调试跟踪永不忘 注释文档是模范 开源主义品德多高尚 …

python threading setdaemon_Python中threading的join和setDaemon的区别[带例子]

python的进程和线程经常用到&#xff0c;之前一直不明白threading的join和setDaemon的区别和用法&#xff0c;今天特地研究了一下。multiprocessing中也有这两个方法&#xff0c;同样适用&#xff0c;这里以threading的join和setDaemon举例。1、join ()方法&#xff1a;主线程A…

LeetCode 1176. 健身计划评估(滑动窗口)

文章目录1. 题目2. 解题1. 题目 你的好友是一位健身爱好者。前段日子&#xff0c;他给自己制定了一份健身计划。现在想请你帮他评估一下这份计划是否合理。 他会有一份计划消耗的卡路里表&#xff0c;其中 calories[i] 给出了你的这位好友在第 i 天需要消耗的卡路里总量。 为…

为什么苹果不再需要谷歌地图?

苹果和谷歌之间的专利大战正是如火如荼&#xff0c;在这种两军对垒的时候&#xff0c;iOS设备上的那个明晃晃的谷歌地图图标就像眼中钉肉中刺一样让苹果始终不得安宁&#xff0c;让对手的核心服务扎根到自己的核心平台中&#xff0c;这感觉肯定不好。在最新版本的iPhoto中&…

java sax解析xml_【转】java使用sax解析xml文件

从下面这个url搬运。http://hck.iteye.com/blog/1175762不过程序略有改动。关于sax(搬自百科)SAX&#xff0c;全称Simple API for XML&#xff0c;既是指一种接口&#xff0c;也是指一个软件包。SAX是事件驱动型 XML解析的一个标准接口不会改变 SAX的工作原理简单地说就是…

LeetCode 422. 有效的单词方块

文章目录1. 题目2. 解题1. 题目 给你一个单词序列&#xff0c;判断其是否形成了一个有效的单词方块。 有效的单词方块是指此由单词序列组成的文字方块的 第 k 行 和 第 k 列 (0 ≤ k < max(行数, 列数)) 所显示的字符串完全相同。 注意&#xff1a; 给定的单词数大于等于…

中断处理

首先在获得PCI配置空间资源的时候&#xff0c;就要获得中断资源&#xff0c;根据CM_PARTIAL_RESOURCE_DESCRIPTOR 结构的 Type 域来区分需要获得什么样的中断资源的时候&#xff0c;如果Type类型为&#xff1a;CmResourceTypeInterrupt&#xff0c;此时需要将中断资源从CM_PART…

java calendar计算时间差_Java Calendar 计算时间差

linux下创建文件与目录时默认被赋予了什么样的权限&quest;当我们创建一个新的文件或目录的时候,他的默认权限是什么? umask--指定当前使用者在创建文件或目录的时候默认的权限值 [rootiZ288fgkcpkZ default]# umask [roo ...x86平台转x64平台关于内联汇编不再支持的解决x8…

SVG-不是图片的图片

SVG-不是图片的图片 导语&#xff1a; 可缩放矢量图形&#xff08;Scalable Vector Graphics&#xff0c;SVG&#xff09;是基于可扩展标记语言&#xff08;XML&#xff09;&#xff0c;用于描述二维矢量图形的一种图形格式。SVG由W3C制定&#xff0c;是一个开放标准。另SVG还是…