题目描述:
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
原理:
用空间换时间,用时间换空间;增加空间来减少时间的消耗
方法1:
考虑两个栈的长度相同,栈中添加一个,min栈也添加一个,删除一个,min栈也删除一个。每次添加数据的时候,向min栈添加一个当前栈中最小元素的节点;原始栈中删除一个,min栈从栈顶删除一个。两个栈的长度始终相同。
示例代码:
class Solution:
# 给这个类一个初始的属性,有一个栈,另外有一个最小值的列表栈
def __init__(self):
self.stack = []
self.minValue = []
def push(self, node):
self.stack.append(node)
# 如果最小值列表里有值
if self.minValue:
#如果最小值列表里的最后一个值 大于 node 这个值,说明node这个值小,那么就放进最小值列表中;
if self.minValue[-1] > node:
self.minValue.append(node)
# 如果列表里面的最后一个值,小于node值,那么就说明node这个值大;那么就添加上次添加进来的那个小的值,与栈中的数据长度保持一致;
else:
self.minValue.append(self.minValue[-1])
# 如果最小值列表里面没有值,就在最小值列表里添加node
else:
self.minValue.append(node)
def pop(self):
# 如果栈为空,返回none,说明没有在栈中无元素,没有最小值
if self.stack == []:
return None
# 栈的长度与最小值的栈的长度要相同,所以最小值列表也需要删除一个
self.minValue.pop()
# 栈不为空,就需要删除一个,删除做pop 操作;返回我们删除的那个数
return self.stack.pop()
def top(self): # 栈顶
# 栈为空,返回none
if not self.stack:
return None
# 栈不为空,返回栈顶元素
return self.stack[-1]
def min(self):
# 栈为空,返回none
if self.minValue == []:
return None
return self.minValue[-1]
方法2:
原始栈和min栈的长度不同。原始栈中添加一个,判断当前添加的元素是否比当前min栈中的最小的元素小,如果当前添加的元素比当前min栈中的元素小,则把当前添加的元素添加到min栈中,否则,min栈中不添加元素。原始栈中删除一个,判断当前删除的原始栈中的元素是否与min栈中最小的元素相同(即min栈的栈顶的元素),若相同,则删除min栈中栈顶的元素,否则,min栈不删除元素。
class Solution:
def __init__(self):
self.stack = []
self.minValue = []
def push(self, node):
self.stack.append(node)
if self.minValue:
# 如果最小值列表里的最后一个值 大于 node 这个值,说明node这个值小,那么就放进最小值列表中;
if self.minValue[-1] > node:
self.minValue.append(node)
# 最后一个值不大于node这个值得话;不做操作,不需要把它两个做的长度一致
else:
self.minValue.append(node)
def pop(self):
if self.stack == []:
return None
# 删除的时候,判断要删除的元素是不是与min栈里的最后一个元素,如果是,也需要删除min栈中栈顶的元素
if self.stack[-1] == self.minValue[-1]:
self.minValue.pop()
return self.stack.pop()
# 如果要删除的元素与min栈中栈顶元素不等,不需要删除min栈中栈顶的元素
else:
return self.stack.pop()
def top(self):
if self.stack == []:
return None
return self.stack[-1]
def min(self):
if self.minValue == []:
return None
return self.minValue[-1]
视频链接:https://www.bilibili.com/video/av64288683?p=15