0x01.问题

设计一个支持 pushpoptop 操作,并能在常数时间内检索到最小元素的栈。

  • push(x) —— 将元素 x 推入栈中。
  • pop() —— 删除栈顶的元素。
  • top() —— 获取栈顶元素。
  • getMin() —— 检索栈中的最小元素。

示例:

输入: [“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”]
[[],[-2],[0],[-3],[],[],[],[]]

输出: [null,null,null,null,-3,null,0,-2]

解释:
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); --> 返回 -3.
minStack.pop();
minStack.top();
–> 返回 0. minStack.getMin();
–> 返回 -2.

提示:

  • poptopgetMin 操作总是在 非空栈 上调用。

0x02.详细算法思路

  • 我们发现这个最小栈最重要的特征就是 在常数级的时间得到最小值。(这也是这个算法核心)

  • 仔细思考一下,如何才能在常数级别的时间获取最小值?

    • 既然是常数级别的时间,那么这个最小值肯定在其它操作时已经生成了,到具体某一个栈顶元素,只要拿来用就行。

    • 初始的时候,会想到维护一个全局的最小值,根据相应的操作更新就行了。但是,这里就存在一个问题,栈是会不断更新的,如何当前的最小值已经pop了,那么,如何去寻找下一个最小值,所以,单一的维护一个最小值,肯定是不行的。

    • 既然单一的维护不行,这暗示着我们,需要去维护一个数组级别最小值,这个数组级别应该满足什么特征呢?

      • 需要满足,对于每个栈顶元素,都能找到对应的最小值。
    • 也就是说,我们维护的这个数组级别的最小值需要和栈的每个元素相对应,最好的解决办法是什么?

      • 没错,就是维护一个辅助栈,对于原栈的每个栈顶元素,辅助栈中对应的元素就是其最小值。
  • 具体辅助栈的维护思路:

    • 初始时,辅助栈中放入一个元素Integer.MAX_VALUE。目的是避免非空判断。
    • 每次进行push(x)操作时,对辅助栈的操作是F.push(min{x,F.peek()})。也就是放入x和当前栈顶中的最小值,这个维护步骤就是保持两栈始终对应的关键步骤。
    • 每次进行pop()操作时,两栈同时pop()
    • 每次进行getMin()操作时,返回F.peek()

0x03.解决代码–辅助栈的维护

class MinStack {private Stack<Integer> S=new Stack<>();private Stack<Integer> F=new Stack<>();/** initialize your data structure here. */public MinStack() {F.push(Integer.MAX_VALUE);}public void push(int x) {F.push(Math.min(F.peek(),x));S.push(x);}public void pop() {F.pop();S.pop();}public int top() {return S.peek();}public int getMin() {return F.peek();}
}

ATFWUS --Writing By 2020–05-12

最小栈--辅助最小值栈的维护相关推荐

  1. 面试题 03.02. 栈的最小值/面试题30. 包含min函数的栈/155. 最小栈

    2020-05-10 1.题目描述 栈的最小值 2.题解 需要牺牲空间换时间,可以用vector来存储至当前元素的最小值,在push或者pop元素的时候需要更新. 3.代码 class MinStac ...

  2. C++的STL栈实现获取栈中最小元素的成员

    实现一个获取栈中最小数据成员的函数,该栈支持如下操作: 1.push(x) : 将元素x压入栈中 2.pop() : 弹出(移除)栈顶元素 3.top() : 返回栈顶元素 4.getMin() : ...

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

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

  4. 栈实现:入栈、出栈、取最小元素的时间复杂度都是O(1)。

    场景: 实现一个栈,带有出栈(pop),入栈(push),取最小元素(getMin)三个方法.要保证这三个方法的时间复杂度都是O(1). 方法一: 设两个栈A/B,A:存放原始数据,B:栈顶为最小元素 ...

  5. 面试题 03.02. 栈的最小值

    面试题 03.02. 栈的最小值 思路:两个栈,一个存数据,一个存当前最小值 class MinStack { public:stack<int> s1;stack<int> ...

  6. 每天一算法(二)实现栈的push pop 操作,并可以输出栈的最小值

    实现栈的push pop 操作,并可以输出栈的最小值 // SatckMin.cpp : 定义控制台应用程序的入口点. //#include "stdafx.h" #include ...

  7. T0001.数据结构面试题---栈---获取最小值

    题目 实现一个特殊的栈,在实现栈基本功能的基础上,实现返回栈中最小元素的操作. 要求: 1.pop,push,getMin操作的时间复杂度为O(1) 2.可使用现成的栈结构 GitHub源码 GitH ...

  8. [力扣刷题总结](栈和单调栈篇)

    文章目录 ~~~~~~~~~~~~栈~~~~~~~~~~~~ 155. 最小栈 解法1:链表 剑指 Offer 31. 栈的压入.弹出序列 解法1:模拟栈 20. 有效的括号 解法1:栈 相似题目: ...

  9. 0x11.基本数据结构 — 栈与单调栈

    目录 一.栈 0.AcWing 41. 包含min函数的栈 (自己造栈) 1.AcWing 128. 编辑器 (对顶栈) 2.AcWing 129. 火车进栈 3.AcWing 130. 火车进出栈问 ...

最新文章

  1. Android添加权限大讲解
  2. “编程能力差!90%输在这点上”谷歌AI专家:其实都是瞎努力!
  3. IndexedDB 索引数据库
  4. 网站排名好却没流量到底是什么环节出了问题?
  5. windows 代理软件_一款强大的远程控制实用软件,分享给你……
  6. 痞子衡嵌入式:ARM Cortex-M内核那些事(2)- 第一款微控制器
  7. 前端学习(1185):数据响应式
  8. 【 HDU - 2594 】Simpsons’ Hidden Talents(KMP应用,求最长前缀后缀公共子串)
  9. 计算机英语六级,英语六级作文范文:计算机
  10. RabbitMQ 镜像模式 集群架构 工作最常用集群
  11. sqlerror.java 1074_java.sql.SQLException: Before start of result set异常
  12. HDU 2063 过山车
  13. adobe出的cookbook
  14. gin 渲染不同目录下的模板(支持多层目录)
  15. 虚拟服务器+ftp上传错误,虚拟主机FTP无法上传文件解决办法
  16. [深度学习概念]·主流声学模型对比
  17. 合生活门禁复制数据结构分析
  18. 金誉半导体笔记:什么是MCU单片机的SPI、UART、I2C通讯接口
  19. 网络与社会导论课上所学感悟
  20. ubuntu idea 卸载

热门文章

  1. Centos python升级
  2. 1ppt com html,《网页制作1html简介.ppt
  3. 【Python】实现一个鼠标连击器,每秒点击1000次
  4. NetStream appendBytes 一点经验
  5. 2-1 CAD基础 对象选取
  6. 易语言学习笔记(四)--js解密,图形验证码,滑块,鱼刺多线程
  7. Java字符串比较的几种方法
  8. linux后台运行命令
  9. python取整函数 向上取整 向下取整 四舍五入
  10. 2022年520有什么礼物可以买?ipad2022手写笔推荐