文章目录

  • 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)相关推荐

  1. [剑指offer][JAVA]面试题第[30]题[包含min函数的栈][双栈辅助栈][单栈]

    [问题描述][中等] 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min.push 及 pop 的时间复杂度都是 O(1).示例:MinStack min ...

  2. 每日写题分享--包含min函数的栈/双栈实现

    题目描述: 题目链接:包含min函数的栈 思路: 1.建立两个栈,一个是存储所有数据并可以正常实现push,pop,peek等函数的数据栈stack1,一个是存储stack1非严格降序的辅助栈stac ...

  3. c语言建立栈(顺序栈、双栈和链式栈)

    c语言建立栈 顺序存储 栈的顺序存储定义 初始化栈 入栈操作 出栈操作 其余操作 读取栈顶元素 栈中元素个数 栈是否为空 双栈 双栈的顺序存储结构定义 建立双栈 判断栈为空 进栈操作 出栈操作 链式栈 ...

  4. LeetCode 1472. 设计浏览器历史记录(双栈)

    1. 题目 你有一个只支持单个标签页的 浏览器 ,最开始你浏览的网页是 homepage ,你可以访问其他的网站 url ,也可以在浏览历史中后退 steps 步或前进 steps 步. 请你实现 B ...

  5. LeetCode 341. 扁平化嵌套列表迭代器(双栈)

    文章目录 1. 题目 2. 双栈解题 1. 题目 给定一个嵌套的整型列表.设计一个迭代器,使其能够遍历这个整型列表中的所有整数. 列表中的项或者为一个整数,或者是另一个列表. 示例 1: 输入: [[ ...

  6. LeetCode 103. 二叉树的锯齿形层次遍历(BFS / 双栈)

    1. 题目 给定一个二叉树,返回其节点值的锯齿形层次遍历.(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行). 例如: 给定二叉树 [3,9,20,null,null,15,7] ...

  7. 2022-3-31 Leetcode 716.最大栈

    1.好像不能用 stack 作为容器 class MaxStack {public:stack<int> maxsk;stack<int> sk;MaxStack() {max ...

  8. Leetcode刷题笔记:栈与队列篇

    基础知识 栈和队列的原理大家应该很熟悉了,队列是先进先出,栈是先进后出. 如图所示: 那么我这里再列出四个关于栈的问题,大家可以思考一下.以下是以C++为例,使用其他编程语言的同学也对应思考一下,自己 ...

  9. Leetcode224 基本加减计算器-双栈和状态转换

    题目 实现一个基本的计算器来计算一个简单的字符串表达式的值. 字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 . 示例 1: 输入: "1 + 1&quo ...

最新文章

  1. Android 使用adb 命令截图 的方法
  2. mysql 5.7巡检脚本_mysql自动化巡检脚本生成html报告
  3. Lua 操作 MongoDB 数据库实例
  4. 用R做heatmap示例:NBA联盟50位顶级球员的指标表现
  5. Django从理论到实战(part23)--模板继承
  6. 黑科技揭秘:百种异常随机注入,专有云为何稳如泰山
  7. 物联网计算机相关专业吗,物联网工程属于计算机专业吗
  8. 计算机专业理科二本录取分数线,这7所211理科录取分数线较低,普通考生记得关注,2所有二本招生...
  9. Android图片加载之初步认识bitmap
  10. 沉船会有什么_世界六大沉船,最后一艘有40吨财宝!8吨黄金!你眼红了吗?
  11. python 引入同一路径的类_Python实现Wordcloud生成词云图的示例
  12. 【转】Jmagick的使用例子
  13. 编译原理第四章课后题
  14. java der decode_支付宝进行签名时爆DER input, Integer tag error异常
  15. 论文阅读:RGCF: Refined Graph Convolution Collaborative Filering with Concise and Expressive Embedding
  16. c# winform 无边框窗体 移动办法
  17. java对外接口安全问题_怎么保证对外暴露接口的安全性(调用频率限制)
  18. kali linux无线驱动安装,Kali Linux 安装WIFI无线网卡驱动:rtl8822bu 教程
  19. java函数修饰符_Java 函数 面向对象,修饰符,类,构造方法,this
  20. 成都榆熙电子商务有限公司:拼多多商家如何剖析用户数据?

热门文章

  1. opencv python教程简书_OpenCV-Python系列二:常用的图像属性
  2. python3.8 实现鼠标自动移动_“新生报到”!【移动机器人 HD-1500】负载1500kg,实现了重型货物运输的自动化...
  3. java metric_java版的Metric工具介绍
  4. python3图片转代码_python3图片转换二进制存入mysql示例代码
  5. Linux进程全解3——进程概念、进程ID、多进程调度原理
  6. Linux下WPS自主设置快捷键,电脑wps的word怎么自主设定快捷键
  7. [Lydsy1805月赛] 对称数
  8. django 模板继承与重写
  9. UEditor编辑器第一次赋值失败的解决方法
  10. Sargable 与 谓语下推 (predicate pushdown) 简介