1、题目描述
设计一个支持 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]
2、初始思路
2.1 思路
对于栈和队列,都是基于列表,实现列表的特殊操作。
栈为先进后出,队列为先进先出
对于最小栈,可以新建一个minstack,用来存储最小的元素,比如,当当前值<=最小栈栈顶元素时,可以将该元素入栈。
def push(self, val: int) -> None:
self.stack.append(val)
if not self.minstack or val <= self.minstack[-1]:
self.minstack.append(val)
当实行pop操作时,此时要注意,由于有些元素并未加入最小栈中,因此只有当栈的栈顶元素与最小栈的栈顶元素相同时,最小栈才需要实行pop操作。
def pop(self) -> None:
if self.stack:
if self.minstack and self.stack[-1] == self.minstack[-1]:
self.minstack.pop()
self.stack.pop()
栈的栈顶元素即为最后入栈的元素,也就是列表中的最后一个元素
def top(self) -> int:
if self.stack:
return self.stack[-1]
同理,由于按照递减的操作进行最小栈的入栈操作,最小栈的栈顶元素即为最小元素。
def getMin(self) -> int:
if self.minstack:
return self.minstack[-1]
2.2 完整代码
class MinStack:
def __init__(self):
self.stack = []
self.minstack = []
def push(self, val: int) -> None:
self.stack.append(val)
if not self.minstack or val <= self.minstack[-1]:
self.minstack.append(val)
def pop(self) -> None:
if self.stack:
if self.minstack and self.stack[-1] == self.minstack[-1]:
self.minstack.pop()
self.stack.pop()
def top(self) -> int:
if self.stack:
return self.stack[-1]
def getMin(self) -> int:
if self.minstack:
return self.minstack[-1]
# 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()