LeetCode最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
- push(x) —— 将元素 x 推入栈中。
- pop() —— 删除栈顶的元素。
- top() —— 获取栈顶元素。
- getMin() —— 检索栈中的最小元素。
示例:
输入:
["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.
思路:
这道题是简单题了,尤其是我们用python来做的话,基本上列表中的常用操作也都有了。但除了用python来的列表来模拟栈之外,比较难的点在于如何在常数时间复杂度内获取栈的最小值。我第一次想到的办法是额外用一个常数变量来记录和更新入栈元素的最小值,但很显然这种做法,并不是在栈内去检索了,属于投机取巧。那么,反过来,我们其实只需要把这个值放在栈内的某一个固定地方即可!然后每次添加进新元素,更新这个位置的值不就行了吗?
栈里哪个位置可以存放这么一个最小值呢?好像也不好找,因为每一个地方都是存放的真实数据呀。但如果我们把存放的数据从一个变成一对(每次放一个元组),就有地方放了。我们把栈顶元素的第二位(下标1)用来存放全栈的最小值,每次加入新元素时,就比较新元素的值和原栈顶元素的第二位(下标1)的大小,并把新的较小值放置在新栈顶元素的第二位。
代码:
class MinStack(object):
def __init__(self):
self.stack=[] #初始化栈就用一个队列模拟了
def push(self, val):
if not self.stack: #如果栈原来没有元素
self.stack.append((val,val))#直接添加“一对”值,其实就是元组
else:#原来有元素,则添加(值,新的全局最小值)这两个值
self.stack.append((val,min(self.stack[-1][1],val)))
#self.stack[-1][1]原栈顶元素第二位
def pop(self):
self.stack.pop()#列表中的pop()可以直接用……投机取巧了哈哈
def top(self):
return self.stack[-1][0]#返回栈顶元素,就是先下标-1取出元组,在0取元组第一位
def getMin(self):
return self.stack[-1][1]#返回最小元素,就是先下标-1取出元组,在1取元组第二位
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了