LeetCode如何实现包含min函数的栈
发表于:2024-11-14 作者:千家信息网编辑
千家信息网最后更新 2024年11月14日,这篇文章给大家分享的是有关LeetCode如何实现包含min函数的栈的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。题目描述定义栈的数据结构,请在该类型中实现一个能够得到栈的
千家信息网最后更新 2024年11月14日LeetCode如何实现包含min函数的栈
这篇文章给大家分享的是有关LeetCode如何实现包含min函数的栈的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。
各函数的调用总次数不超过 20000 次
题目样例
示例
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.min(); --> 返回 -3.
minStack.pop();
minStack.top(); --> 返回 0.
minStack.min(); --> 返回 -2.
题目思考
内部需要什么数据结构来满足所有操作都是 O(1), 一个栈够吗?
解决方案
思路
要使得 push 和 pop 的复杂度为 O(1), 传统的栈就可以搞定, 难点在于如何使得 min 函数也为 O(1) 如果我们能一直维护当前所有元素的最小值, 那么 min 函数直接返回它就可以, 但问题是在 pop 的时候有可能会正好 pop 这个最小值, pop 之后的最小值(也即原来的次小值)如何得到呢? 要存储多个最小值, 显然一个变量不够用. 而根据上一步的分析, 这里我们可以考虑额外引入一个 单调递减栈, 栈顶存当前最小值, 下面依次是次小, 第三小... 这样如果 pop 了最小值的话, 这个单调栈的栈顶仍会保存 pop 后的最小值, 每次 min 只需要取这个栈的栈顶即可 而 push 的时候也需要额外的操作, 由于是单调栈, 只需要在新的值 小于等于栈顶的时候才 push 到单调栈中.特别注意在等于栈顶的时候也要 push 到单调栈中, 这是因为如果对于重复的最小值 x 不 push, 那么在后续的 pop 其中一个 x 之后, 栈顶(不再是 x)就和实际最小值(仍为 x)不一致了
复杂度
时间复杂度 O(1)
各种操作都是常数复杂度 空间复杂度 O(N)
使用了两个栈
代码
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
# 一个普通栈和一个单调递减栈
self.minstack = []
self.stack = []
def push(self, x: int) -> None:
self.stack.append(x)
if not self.minstack or x <= self.minstack[-1]:
# 如果单调栈顶为空或者当前新值小于等于单调栈顶才push
# 注意这里等于也需要push. 如果对于重复的最小值 x 不 push, 那么在后续的 pop 其中一个 x 之后, 栈顶(不再是 x)就和实际最小值(仍为 x)不一致了
self.minstack.append(x)
def pop(self) -> None:
if not self.stack:
return
x = self.stack.pop()
if x == self.minstack[-1]:
# 如果单调栈顶恰好等于pop的值, 也要pop单调栈
self.minstack.pop()
def top(self) -> int:
if not self.stack:
return -1
return self.stack[-1]
def min(self) -> int:
if not self.minstack:
return -1
return self.minstack[-1]
感谢各位的阅读!关于"LeetCode如何实现包含min函数的栈"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
最小
单调
函数
复杂
复杂度
时候
题目
一致
元素
内容
实际
数据
数据结构
时间
更多
篇文章
结构
不错
实用
普通
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
淘宝客需要做数据库吗
网络安全学习内容150字
数据库与应用实践教程读后感
网络安全查控工作总结
阿里云服务器异常登录
一个服务器的端口号可以同时用吗
重庆苹果手机软件开发
做好网络安全文化建设
北京电视墙服务器厂家
华材计算机网络技术分数
人工智能和网络安全研究生
提交按钮显示数据库提示
天使之战多久开一个服务器
光纤收发器网线插服务器不亮
数据库复制要管理员
英雄联盟能登录但进不去服务器
为什么要有服务器交换机
生产企业的网络安全措施
软开岗不会软件开发
裁决战歌服务器等级怎么降
atm网络技术的支持厂商
软件开发岗位津贴发放标准
进入数据库网站
瑞庭网络技术是外包吗
加强信息化和网络安全
成都理工大学查重数据库
杭州融宽网络技术
mysql数据库的连接数
校园网络安全管理制度小学
个人网络安全应注意什么