今天在Leetcode刷了一道关于最小栈的问题,题目如下:

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

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

示例:

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

我的解法:
刚开始解这道题时,自己的想法是用一个数组实现栈,然后分别用属性length和属性tag记录栈顶下标,每次获取最小值都要执行一次for循环查找最小值,虽然提交通过了,但是所用时间和空间都比较大,于是在评论区找了一个比较优秀的解题方法,如下:
别人的优秀解法:
使用两个数组,一个作为数据存储栈,一个作为最小值栈(记录每次入栈后的最小值),代码如下:

class MinStack {//以下是评论区比较好的解法,采用两个数组,一个作为数据栈,一个作为最小值栈private Integer[]value;   // 保存最小值数组 private Integer[]minValue;   // 容量 private int capacity = 10;private int size = 0;     // 元素数量public MinStack() {value = new Integer[capacity];minValue = new Integer[capacity];}// 将元素 x 推入栈中public void push(int x) {// 要扩容了if (size >= capacity){grow();}value[size] = x;// 存最小值if (size == 0){minValue[size] = x;} else if (minValue[size-1] > x){minValue[size] = x;} else {minValue[size] = minValue[size-1];}size++;}// 删除栈顶的元素。public void pop() {value[--size] = null;}//  获取栈顶元素。public int top() {return value[size-1];}// 检索栈中的最小元素。public int getMin() {return minValue[size-1];}// 满了进行扩容,一倍private void grow(){capacity *= 1.5;Integer []copy = new Integer[capacity];Integer []minCopy = new Integer[capacity];System.arraycopy(value, 0, copy, 0,size);System.arraycopy(minValue, 0, minCopy, 0,size);value = copy;minValue = minCopy;}
}

现在分析一下最小栈的存储过程和作用:
假如数据栈入栈的顺序是 -2,0,-3,数据栈和最小栈的栈顶指针 size 同步移动,最小栈变化如下:
增加一个最小值栈的作用:
每次入栈、出栈都更新最小值,如果数据栈出栈元素刚好是最小栈的栈顶元素,能够同步栈顶元素的位置,避免最小值出错。

Leetcode 最小栈问题相关推荐

  1. LeetCode——最小栈

    题目描述: 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. top() -- ...

  2. Leetcode刷题 155题: 最小栈(基于python3和c++两种语言)

    ** Leetcode刷题 155题: 最小栈(基于python3和c++两种语言) ** ** 题目: ** 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. ...

  3. 《LeetCode力扣练习》第155题 最小栈 Java

    <LeetCode力扣练习>第155题 最小栈 Java 一.资源 题目: 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. 实现 MinStack ...

  4. LeetCode篇之栈:155(常数时间复杂度内找最小栈)

    LeetCode篇之栈:155-->最小栈 题目: 解题思路: 源码: 踩坑点: 题目: 解题思路: 源码: typedef struct Linknode{int data;int min;s ...

  5. 【LeetCode】【HOT】155. 最小栈(辅助栈)

    [LeetCode][HOT]155. 最小栈 文章目录 [LeetCode][HOT]155. 最小栈 package hot;import java.util.ArrayDeque; import ...

  6. leetcode系列-155.最小栈

    leetcode系列–第155题.最小栈 题目描述: 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. 实现 MinStack 类: MinStack() 初始化 ...

  7. LeetCode第155题—最小栈

    本次写的题目是最小栈,为LeetCode里面的题目,让我们来康康是如何解出这道题目的吧,各位尚没有思路的小伙伴可以跟随着博主的解题思路一步步来,感受一下

  8. leetcode 155. 最小栈

    难度:简单 频次:59 题目: 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈. 实现 MinStack 类: MinStack() 初始化堆栈对象. void ...

  9. LeetCode:155. 最小栈

    题目链接 155.最小栈 题目描述 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈. push(x) -- 将元素 x 推入栈中. pop() -- 删除栈顶的元素. ...

最新文章

  1. Java基础加强总结(三)——代理(Proxy)
  2. stm32f4之GPIO
  3. 5分钟看懂微服务架构下的Consul 特性及搭建
  4. 浏览器svg插件_Archer-svgs: 异步加载svg方案
  5. 0514实训演练 新建项目 使用java编写类与对象 入门
  6. [转]三阶魔方神程序
  7. session跨域共享解决方案
  8. javaWeb基础知识及注意事项
  9. 数据结构与算法(一):线性表、栈、树(二叉树,AVL树)、图
  10. SQL Server事务、视图和索引
  11. Matlab使用for循环将多个行向量合成一个行向量或者一个多维矩阵
  12. 关于Webstorm汉化后无法打开设置,谈谈心里的想法
  13. 【转】十大抢手的网站压力测试工具
  14. LeetCode -- Word Ladder
  15. isprime函数python_Python“函数”之我见
  16. python输入直角三角形两条直角边、输出斜边长_python直角三角形的两个直角边、求斜边_直角三角形斜边公式计算器 两个直角边边长的平方加起来等......
  17. vue+element去重并且替换符号为英文分号
  18. 6000级石阶见证绝世爱情
  19. ARVR | AR技术发展简史(上)
  20. 获取微信用户在微信小店的订单

热门文章

  1. 20155216 2016-2017-2 《Java程序设计》第三周学习总结
  2. 老李推荐:第14章8节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-获取控件列表并建立控件树 1...
  3. C#基础概念二十五问[转]
  4. java编码规范日常积累(持续更新)
  5. 小程序入门学习15---数据库实战01
  6. linux下mongo工具,linux – 从另一台机器上使用mongodb工具(mongodump,mongorestore)
  7. 某集团BI决策系统建设方案分享
  8. 数据分析学习笔记—python数据类型与数据容器
  9. php多进程采集百度,php实现多进程下载百度网盘文件
  10. vue路由配置src/router/index.js