注意审题:常数时间、线性时间。
基本思想:同时利用数据栈和辅助栈,以空间换时间。
由于题目要求只花费常数时间,故需要借助“以空间换时间”的思想。
此题使用辅助栈,在数据入数据栈时即考虑是否放入辅助栈,因此不用在调用getmin函数时重新全部扫描一遍数据栈内的数据,花费的是常数时间而不是线性时间。
辅助栈的入栈与出栈:
当辅助栈为空时,
入栈
;当待入数据栈的数小于或等于辅助栈栈顶的数时,
入栈
;
当数据栈栈顶元素要出栈时,如果该元素与辅助栈顶元素相同,则辅助栈栈顶元素也要
出栈
,因为此时数据栈的最小元素已经出栈;否则没必要,反正数最小的元素一直在辅助栈顶,是否删除辅助栈内的相同元素不影响后续getmin的判断。
数据栈的入栈与出栈:
略
代码样例:
class MinStack:
def __init__(self):
self.stack = []
self.helper = []
def push(self, x: int) -> None:
self.stack.append(x)
if len(self.helper)==0 or x<=self.helper[-1]:
self.helper.append(x)
def pop(self) -> None:
if self.helper[-1] == self.stack.pop():
self.helper.pop()
def top(self) -> int:
return self.stack[-1]
def getMin(self) -> int:
return self.helper[-1]
其他解法:
解法二
:只用一个栈(存储数据和以往的“当前最小值”)和一个变量(存储当前最小值)。
当更新当前最小值时,将旧的当前最小值压入栈中;
当执行出栈操作时,若出栈的元素与当前最小值相同,则出栈该元素后,再执行一次出栈操作,并将当前最小值更新为这次出栈元素的值。
解法三
:只用一个栈(存储每个数与当前最小值的差值)和一个变量(存储当前最小值)
当要入栈的数是负数时,更新当前最小值为(原”当前最小值“+该负数)。
当要出栈的数是负数时,更新当前最小值为(原”当前最小值“-该复数)。
每次调用top()函数时,返回栈顶元素的值与当前最小值的和。
解法四
:修改数据结构,存储每个元素时,同时在同一位置存储至目前为止所有元素中的最小值,即将[value, min]作为一个整体存储。因此调用getmin函数时,直接获取栈顶元素的min部分的值。