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. plsql基础练习题

    1.键盘输入一个年份,判断是否是闰年; (能被4整除而不能被100整除或者能被100和400同时整除,满足其一即可); 方法1 declare v_year number(4):=&请输入一个 ...

  2. [01]从零开始学 ASP.NET Core 与 EntityFramework Core 课程介绍

    从零开始学 ASP.NET Core 与 EntityFramework Core 课程介绍 本文作者:梁桐铭- 微软最有价值专家(Microsoft MVP) 文章会随着版本进行更新,关注我获取最新 ...

  3. windows 安装使用jupyter及 基础配置

    jupyter 是什么Jupyter Notebooks 是一个交互式笔记本,支持运行 40 多种编程语言,它的本质是一个 开源的 Web 应用程序,我们可以将其用于创建和共享代码与文档,他可以支持实 ...

  4. 7.JavaCC官方入门指南-例2

    例2:整数加法运算--改良版(增强语法分析器) 1.修改   上一个例子中,JavaCC为BNF生产式所生成的方法,比如Start(),这些方法默认只简单的检查输入是否匹配BNF生产式指定的规范.但是 ...

  5. 6-SQL子查询

    (1) 什么是关联子查询,什么是非关联子查询 (嵌套查询) 子查询从数据表中查询了数据结果,如果这个数据结果只执行一次,然后这个数据结果作为主查询的条件进行执行,那么这样的子查询叫做非关联子查询. 如 ...

  6. 以聚合数据免费接口为例,通过 Class 类继承方法,让小程序实现项目化接口调用

    微信小程序数据来源,是通过接口实现的.但接口如何调,数据如何取?每个人都有不同的方法,下面以聚合数据免费接口为例. 配置接口 config.js 聚合数据请求接口需要以key作为参数. const c ...

  7. web网页利用JavaScript实现对摄像头的调用

    实现效果: 代码如下: <!DOCTYPE html> <html lang="zh"> <head> <meta charset=&qu ...

  8. configure.ac文件和Makefile.am文件 编译

    在编译安装openvpn 项目时遇到,其编译过程如下:生成 configure 可执行文件 make && make install ; . aclocal . autoconf . ...

  9. liteos动态加载(十三)

    1. 概述 1.1 基本概念 动态加载是一种程序加载技术. 静态链接是在链接阶段将程序各模块文件链接成一个完整的可执行文件,运行时作为整体一次性加载进内存.动态加载允许用户将程序各模块编译成独立的文件 ...

  10. 在PyCharm中打开文件的位置

    选中文件,右键选择  Show in Explorer (在资源管理器中显示) 只需要路径时,选择第四个Copy Path ,会复制文件的路径