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.
python
法一、辅助栈
- 在每个元素 a 入栈时把当前栈的最小值 m 用一个辅助栈存储起来。在这之后无论何时,如果栈顶元素是 a,我们就可以直接返回存储的最小值 m。
class MinStack:
def __init__(self):
self.stack = [] #初始化栈
self.min_stack = [math.inf] #初始化辅助栈
def push(self, x: int) -> None:
self.stack.append(x) #加入栈
self.min_stack.append(min(x, self.min_stack[-1])) #取当前辅助栈的栈顶存储的最小值,与当前元素比较得出最小值,将这个最小值插入辅助栈中;
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]
法二、一个栈同时保存当前值和栈内最小值
- 可以用一个栈,这个栈同时保存的是每个数字 x 进栈的时候的值 x与 插入该值后的栈内最小值。即每次新元素 x 入栈的时候保存一个元组:(当前值 x,栈内最小值)。
这个元组是一个整体,同时进栈和出栈。即栈顶同时有值和栈内最小值,top()函数是获取栈顶的当前值,即栈顶元组的第一个值; getMin() 函数是获取栈内最小值,即栈顶元组的第二个值;pop() 函数时删除栈顶的元组。
每次新元素入栈时,要求新的栈内最小值:比较当前新插入元素 x 和 当前栈内最小值(即栈顶元组的第二个值)的大小。
class MinStack(object):
def __init__(self):
self.stack = [] #初始化栈
def push(self, x):
"""
:type x: int
:rtype: void
"""
if not self.stack: #栈为空
self.stack.append((x, x))
else: #栈不空
self.stack.append((x, min(x, self.stack[-1][1]))) #保存元组 (x, min(此前栈内最小值, x)))
def pop(self):
self.stack.pop()#删除栈顶的元组
def top(self): #获取栈顶的当前值,即栈顶元组的第一个值
return self.stack[-1][0]
def getMin(self): #获取栈内最小值,即栈顶元组的第二个值
return self.stack[-1][1]
JavaScript
法一、辅助栈
//初始化栈和保存对应最小元素的栈
var MinStack = function() {
this.x_stack =[]
this.min_stack =[Infinity]
};
MinStack.prototype.push = function(x) {
this.x_stack.push(x)
//当一个元素要入栈时,取当前辅助栈的栈顶存储的最小值,与当前元素比较得出最小值,将这个最小值插入辅助栈中;
this.min_stack.push(Math.min(this.min_stack[this.min_stack.length-1],x))
};
MinStack.prototype.pop = function() {
this.x_stack.pop()
this.min_stack.pop()//当一个元素要出栈时,把辅助栈的栈顶元素也一并弹出;
};
MinStack.prototype.top = function() {
return this.x_stack[this.x_stack.length-1]
};
MinStack.prototype.getMin = function() {
return this.min_stack[this.min_stack.length-1]//在任意时刻,栈内元素的最小值就存储在辅助栈的栈顶元素中
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人