LeetCode 155:最小栈 Min Stack

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

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

Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.

  • push(x) -- Push element x onto stack.
  • pop() -- Removes the element on top of the stack.
  • top() -- Get the top element.
  • getMin() -- Retrieve the minimum element in the stack.

示例:

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

解题思路:

起初我以为定义一个指针指向最小值即可,后面才想到在栈中弹出元素时,如果弹出的元素是最小值,那这个指针就需要更 改选择另一个最小元素。没办法,想做到入栈出栈和弹出最小值均为 O(1) 的时间复杂度,那么只能牺牲空间来换。可以另外新建一个栈来顺序存入数据最小值。

注意:Python中没有单独的 Stack 数据结构,其实它的数组就有弹出和压入功能。也可以用 collections.deque() 数据结构。 另外在数据入栈时需要判断该值是否比辅助栈的栈顶元素的值更小,如果更小,也应该将它加入辅助栈。并且需要判断辅助栈是否为空,在不空的条件下才可以取栈顶元素比较,否则会溢出。

事实上每次都要调用函数判断是否为空这个操作,相对这道题的运行时间来说很耗时,就这道题而言是可以避免的,只需给辅助栈加入整型最大值作为栈底元素即可。

Java:

class MinStack {
Stack<Integer> s1 = new Stack<>();//初始化栈
Stack<Integer> s2 = new Stack<>();//辅助栈顺序存入最小值 public MinStack() {
s2.push(Integer.MAX_VALUE);//先加入整型最大值在栈底,避免判断辅助栈是否为空
} public void push(int x) {
s1.push(x);
if (s2.peek() >= x) s2.push(x);//比栈顶元素值小或相等就加入辅助栈
} public void pop() {
int tmp = s1.pop();
if (tmp == s2.peek()) s2.pop();//弹出栈的元素值如果和辅助栈顶元素值相等,也在辅助栈弹出它
} public int top() {
return s1.peek();//返回栈顶元素
} public int getMin() {
return s2.peek();//返回辅助栈栈顶元素即是最小值
}
}

Python3:

class MinStack:
#初始化数据结构(数组),s2作为辅助栈加入整形最大值做栈底,避免判断辅助栈是否为空
def __init__(self):
self.s1 = []
self.s2 = []
self.s2.append(sys.maxsize) def push(self, x: int) -> None:
self.s1.append(x)
#取栈顶元素直接用数组负值索引 Array[-1] 取最后一个值
if self.s2[-1] >= x: self.s2.append(x) def pop(self) -> None:
tmp = self.s1.pop()
if tmp == self.s2[-1]: self.s2.pop() def top(self) -> int:
return self.s1[-1] def getMin(self) -> int:
return self.s2[-1]

LeetCode 155:最小栈 Min Stack的更多相关文章

  1. Java实现 LeetCode 155 最小栈

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

  2. [Swift]LeetCode155. 最小栈 | Min Stack

    Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...

  3. LeetCode 155 - 最小栈 - [数组模拟栈]

    题目链接:https://leetcode-cn.com/problems/min-stack/description/ 设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的 ...

  4. leetcode 155. 最小栈(c++)

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

  5. LeetCode——155. 最小栈

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

  6. 【LeetCode】155. 最小栈

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

  7. LeetCode 刷题笔记 155. 最小栈(Min Stack)

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

  8. leetcode算法学习----155. 最小栈(MinStack )

    下面题目是LeetCode算法155题: https://leetcode.com/problems/min-stack/ 题目1:最小函数min()栈 设计一个支持 push,pop,top 操作, ...

  9. Leetcode题目155.最小栈(简单)

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

随机推荐

  1. ASP.NET 数据绑定

    控件绑定数据源控件手动方式: DataSourceID = 数据源控件名称下拉框绑定 A.设置Datasource B.DataTextField="name"' //显示的值 C ...

  2. Java开发桌面程序学习(12)——Javafx 悬浮窗提示 tooptip

    Javafx 悬浮窗提示 tooptip 鼠标悬浮在某个控件,弹出提示,效果如下: 代码: //control是某个控件 Tooltip.install(control, new Tooltip(&q ...

  3. CDN加速静态文件访问

    CDN加速静态文件访问 全局调度 缓存技术 内容分发 带宽优化 CDN是Content Delivery Network的缩写,意思是内容分发网络.CDN的作用是把用户需要的内容分发到离用户近的地方, ...

  4. 剑指offer 15:链表的倒数第k个节点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 解题思路 使用快慢指针法,让快指针先走k步,然后再让慢指针开始走,当快指针到达链表尾部时,慢指针刚好到达倒数第k个节点. C++代码实现: /* ...

  5. Python用python-docx读写word文档

    python-docx库可用于创建和编辑Microsoft Word(.docx)文件.官方文档:https://python-docx.readthedocs.io/en/latest/index. ...

  6. ABP进阶教程9 - CSV导出中文乱码

    点这里进入ABP进阶教程目录 问题描述 功能按钮 - 导出CSV,中文信息导出为乱码. 解决方案 打开展示层(即JD.CRS.Web.Mvc)的\wwwroot\view-resources\View ...

  7. Git:SSH、SSH与HTTP区别、git常用命令

    SSH1.首先需要检查你电脑是否已经有 SSH key cd ~/.sshls12.ssh表示ssh文件是个隐藏文件查看是否存在 id_rsa.pub 或 id_dsa.pub 文件,如果文件已经存在 ...

  8. 使用vs code编写Markdown文档以及markdown语法详解

    首先安装vscode工具,下载地址如下: https://code.visualstudio.com/ 在vs code的扩展中安装: Markdown Preview Enhanced 这款插件,安 ...

  9. 网络流(2)——用Ford-Fullkerson算法寻找最大流

    寻找最大流 在大规模战争中,后勤补给是重中之重,为了尽最大可能满足前线的物资消耗,后勤部队必然要充分利用每条运输网,这正好可以用最大流模型解决.如何寻找一个复杂网络上的最大流呢? 直觉上的方案 一种直 ...

  10. mysql 插入表情数据报错

    mysql 插入表情数据报错 1.编码类型改成:utf8mb4 2.连接类型也要改成:utf8mb4_general_ci 3.在每个保存的前面执行一次 self.cursor.execute('SE ...