题目描述
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
一开始没有理解题意,看了题解才明白,这道题是想让我们用栈这种数据结构实现min()函数
看到牛客网上 凉风起天末提供的一种思路感觉很好:
链接:https://www.nowcoder.com/questionTerminal/4c776177d2c04c2494f2555c9fcc1e49?answerType=1&f=discussion
来源:牛客网
方法一:简单的双栈法
在返回栈中的min值时,如果仅仅使用一个辅助变量min,则其值可能因为min元素被出栈而失效,常规的做法是额外添加一个同步栈(min栈),以保存记录之前所有的min值,相当于是使用了n个辅助变量,所以空间复杂度是O(n)。
方法二:压缩还原法
我们发现其实最小值min它本身就是一种冗余信息。为什么呢?因为每个元素在数值上都包含了min值,举个例子,假设入栈序列为:4、5、6、3、2、1,那么各轮次对应的min值就是:4、4、4、3、2、1,发现有:
4=4+0,5=4+1,6=4+2,3=4+(-1),2=3+(-1),1=2+(-1);各个元素在数值上已经包含了在它之前的最小值的值;
那么,我们是不是只要在数据栈中存储0、1、2、-1、-1、-1,然后再使用一个辅助变量min=1就可以了呢?
这样,根据单个辅助变量和栈中存储的值就能够推理出top值和min值了,具体规则如下:
入栈:
压缩:将要入栈的元素value减去当前最小值min,得到一个差值diff,只存储该差值;
更新:如果入栈的元素value比当前最小值min小,则要更新最小值:min=value;
初始:第一次入栈比较特殊,因为此时的min变量并没有值,所以令:min=value;
出栈:
更新:如果栈中存储的差值diff是负数,说明出栈的元素是当前最小值min,需要把min值更新为上一个最小值min = min - diff,否则,出栈的元素不是最小值,则不对min变量做任何操作;
还原:如果栈中存储的差值diff是正数,说明 top = min + diff,否则,说明top元素本身是最小值 top = min;
方法一实现代码:
辅助栈同时存储入栈的数据和最小值,top和min可以区分开
class Solution:
def __init__(self):
self.copy = []
def push(self, node):
# write code here
copyMin = self.min()
if copyMin == None or node < copyMin:
copyMin = node
self.copy.append((node,copyMin))
def pop(self):
# write code here
if len(self.copy)==0:
return None
else:
return self.copy.pop()
def top(self):
# write code here
if len(self.copy)==0:
return None
else:
return self.copy[len(self.copy)-1][0]
def min(self):
# write code here
if len(self.copy) ==0:
return None
else:
return self.copy[len(self.copy)-1][1]