Leetcode155-最小栈

  • Post author:
  • Post category:其他


注意审题:常数时间、线性时间。

基本思想:同时利用数据栈和辅助栈,以空间换时间。

由于题目要求只花费常数时间,故需要借助“以空间换时间”的思想。

此题使用辅助栈,在数据入数据栈时即考虑是否放入辅助栈,因此不用在调用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部分的值。



版权声明:本文为wanlinBee原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。