题目
设计一个支持 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.
提示:
-231 <= val <= 231 - 1
pop
、top
和getMin
操作总是在 非空栈 上调用push
,pop
,top
, andgetMin
最多被调用3 * 104
次
自己的一些思考
我每次在看到这个题目的时候都会写一点思考,有些时候思考不一定全都对,很多时候都是一个暴力思考。但是思考的流程可能比较重要。有错误也请大家斧正,不过最后的代码一定会是修改且通过用例的。
栈是一个LIFO结构,后进先出。有三种基本的操作。1.PUSH,即把一个元素压入栈顶,push和append的效果都是一样的。可是push用在栈里面,append常见于列表。2.pop,即为去除栈顶上的元素,3.Top/peek,返回栈顶的元素
这个代码想要实现的就是写一个栈,这个栈能够有基础的操作,且能够返回最小值
class MinStack:
def __init__(self):
def push(self, val: int) -> None:
def pop(self) -> None:
def top(self) -> int:
def getMin(self) -> int:
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(val)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()
题目给的参考例子是这个,我们就拿这个来试着分析一下。
def __init__(self):
def push(self, val: int) -> None:
先初始化这个栈,可以写成self.stack=[],这个self指向调用的当前对象,指向对象自身的引用,能够初始化这个对象,然后这里使用的是self.stack=[],创建一个空栈
def push(self, val: int) -> None:
这里在栈顶添加一个元素可以使用这个代码,self.stack.push(val)
def pop(self) -> None:
这里返回最上面的这个也可以用stack里面的方法,self.stack.pop()
def top(self) -> int:
这里要获取top,return self.stack[-1][0],最后面一个元素(可能是一个列表,返回这个列表的第一个值)
def getMin(self) -> int:
那么我到这里的时候就会有一点迷惑,这个Min该怎么样去处理呢,于是我去看了一下题解。
题解
题解当中提到使用一个叫做“辅助栈”的概念
而且这个题解在栈中间插入了元组(里面有不同数据类型的一种数据结构,可以存储一组有序的元素)
什么是辅助栈,辅助栈最经典的例子就是这个最小栈,就是保存栈内所有元素的最小值。有新添加进来的元素都能够获取到这个的最小值,当新元素来的时候,如果它比辅助栈的栈顶元素更小,就把这个新的元素压入辅助栈,当元素出栈是,如果它和辅助栈的栈顶元素大小一致时,就把辅助栈的栈顶也给弹出(POP)
class MinStack(object):
def __init__(self):
"""
initialize your data structure here.、
初始化栈
"""
self.stack = []
def push(self, x):
"""
:type x: int
:rtype: void
"""
#栈内每一个元素都是一个二元组(tuple),
#(x)(x)前一个(x)是真实的元素,后面一个(x)是最小
#如果不是空值,就把自身和现在栈顶的二元组的1做一个比较,
#哪个小,新栈顶上面的[1]就是这个元素
if not self.stack:
self.stack.append((x, x))
else:
self.stack.append((x, min(x, self.stack[-1][1])))
def pop(self):
"""
:rtype: void
"""
self.stack.pop()
def top(self):
"""
:rtype: int
"""
return self.stack[-1][0]
def getMin(self):
"""
:rtype: int
"""
return self.stack[-1][1]
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()
TODO
1.第一刷:2024/3/10
2.切记辅助栈这个概念,可以通过元组这种方法来实现