当前位置: 首页 > news >正文

【LeetCode 算法笔记】155. 最小栈

目录

  • 问题描述
  • 单个栈实现
  • 双栈实现
  • 不开辟额外空间

问题描述

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

实现 MinStack 类:

MinStack() 初始化堆栈对象。
void push(int val) 将元素val推入堆栈。
void pop() 删除堆栈顶部的元素。
int top() 获取堆栈顶部的元素。
int getMin() 获取堆栈中的最小元素。

示例 1:
输入:
[“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.

单个栈实现

题目只是要求 在常数时间内检索到最小元素 ,对其他操作没有要求,那么可以牺牲 pop() 操作的性能是一种可行的办法。

class MinStack:def __init__(self):self.stack = []self.min = float('inf')def push(self, val: int) -> None:self.stack.append(val)if self.min > val:self.min = valdef pop(self) -> None:s = self.stack.pop()if self.stack:if s == self.min:self.min = min(self.stack)else:self.min = float('inf')def top(self) -> int:return self.stack[-1]def getMin(self) -> int:return self.min

getMin() 方法的算法复杂度为: O ( 1 ) O(1) O(1)
如果做 n 次进栈出栈操作,算法总的复杂度为: O ( N 2 ) O(N^2) O(N2)

双栈实现

进一步来说,如果出栈的复杂度不想那么高的话,可以使用一点额外空间来换取速度。
具体来说,再维护一个最小栈,顶部存储当前栈中元素的最小值。

class MinStack:def __init__(self):self.stack = []self.min_stack = []def push(self, val: int) -> None:if not self.stack or self.getMin() > val:self.min_stack.append(val)else:self.min_stack.append(self.getMin())self.stack.append(val)def pop(self) -> None:self.stack.pop()self.min_stack.pop()def top(self) -> int:return self.stack[-1]def getMin(self) -> int:return self.min_stack[-1]

getMin() 方法的算法复杂度为: O ( 1 ) O(1) O(1)
如果做 n 次进栈出栈操作,算法总的复杂度为: O ( N ) O(N) O(N)

不开辟额外空间

网上有人说他在面试的时候被要求,不额外开辟空间,下面列了我找到的答案。
相当于把 双栈实现 中的双栈合并为单个栈,于是栈里存储最小值和当前值之间的差值。每一次出栈的时候,通过这个插值还原出上一个时刻的最小值。

class MinStack:def __init__(self):"""initialize your data structure here."""self.stack = []self.min_value = -1def push(self, x: int) -> None:if not self.stack:self.stack.append(0)self.min_value = xelse:diff = x-self.min_valueself.stack.append(diff)self.min_value = self.min_value if diff > 0 else xdef pop(self) -> None:if self.stack:diff = self.stack.pop()if diff < 0:top = self.min_valueself.min_value = top - diffelse:top = self.min_value + diffreturn topdef top(self) -> int:return self.min_value if self.stack[-1] < 0 else self.stack[-1] + self.min_valuedef getMin(self) -> int:return self.min_value if self.stack else -1

getMin() 方法的算法复杂度为: O ( 1 ) O(1) O(1)
如果做 n 次进栈出栈操作,算法总的复杂度为: O ( N ) O(N) O(N)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • JVM JMM 专题篇 ( 12000 字详解 )
  • 第159天:安全开发-Python-协议库爆破FTPSSHRedisSMTPMYSQL等
  • Redis 篇-初步了解 Redis 持久化、Redis 主从集群、Redis 哨兵集群、Redis 分片集群
  • k8s中的认证授权
  • kubeadm方式安装k8s+基础命令的使用
  • CentOS7更新YUM源
  • 时空大数据平台:激活新质生产力的智慧引擎
  • Python 将矩阵转换为行最简形式 (Row Echelon Form, REF)和列最简形式 (Column Echelon Form, CEF)
  • DB-GPT部署和试用
  • Linux 之父 Linus Torvalds:低调的神话创造者
  • 研究生招生宣传(2024秋)
  • 一步迅速了解Linux
  • 经典sql题(一)求连续登录不少于三天用户
  • 通过JNI创建java对象和访问java属性
  • PostgreSQL配置主从同步
  • php的引用
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【css3】浏览器内核及其兼容性
  • 345-反转字符串中的元音字母
  • classpath对获取配置文件的影响
  • co模块的前端实现
  • crontab执行失败的多种原因
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • IOS评论框不贴底(ios12新bug)
  • java正则表式的使用
  • Laravel Mix运行时关于es2015报错解决方案
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • 安卓应用性能调试和优化经验分享
  • 百度小程序遇到的问题
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 我是如何设计 Upload 上传组件的
  • 小程序、APP Store 需要的 SSL 证书是个什么东西?
  • 延迟脚本的方式
  • 再谈express与koa的对比
  • 深度学习之轻量级神经网络在TWS蓝牙音频处理器上的部署
  • 你对linux中grep命令知道多少?
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • ​​​​​​​​​​​​​​Γ函数
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • #include<初见C语言之指针(5)>
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #pragma 指令
  • #window11设置系统变量#
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (k8s中)docker netty OOM问题记录
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (二)JAVA使用POI操作excel
  • (二十九)STL map容器(映射)与STL pair容器(值对)
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (一)appium-desktop定位元素原理
  • (一)Java算法:二分查找
  • (一)认识微服务