题目
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。
思路
对于栈而言,若最小值在栈底,要获取到最小值,便需要把前面的值都取出来才能获取到最小值。若栈中有n个数据,则时间复杂度为O(n)。
因此,为了降低时间复制度,便采用利用空间换时间的这个思路。
首先建立两个栈,一个栈用于存放原始数据,一个用于令最小值的数据一直在栈顶
通过push和pop函数的改变,实现min函数
Python 实现
原始栈和最小值栈等长
class Solution:
def __init__(self):
self.stack=[]#这个栈存放原始数据
self.minValue=[]#这个栈保持最小值的数据一直在栈顶
def push(self, node):#入栈操作
# write code here
self.stack.append(node)#原始栈添加数据
if not self.minValue:#若最小值栈为空
self.minValue.append(node)#最小值栈添加数据
else:#若最小值栈不为空,判断最小值栈的栈顶值和添加值的大小
if self.minValue[-1]>node:#若最小值栈的栈顶大于添加值
self.minValue.append(node)#把添加值添加到最小值栈里面
else:
self.minValue.append(self.minValue[-1])#否则添加回最小值栈栈顶的值
def pop(self):#出栈操作
# write code here
if self.stack:#若原始栈不为空
self.minValue.pop()#弹出原始栈数据的同时,最小栈的数据也要被弹出,保持数据长度一致
return self.stack.pop()
else:
return None
def top(self):
# write code here
return self.stack[-1]
def min(self):
# write code here
if self.minValue:
return self.minValue[-1]
else:
return None
原始栈和最小值栈不等长
class Solution:
def __init__(self):
self.stack=[]
self.minValue=[]
def push(self, node):
# write code here
self.stack.append(node)
if not self.minValue:
self.minValue.append(node)
else:
if self.minValue[-1]>node:
self.minValue.append(node)
def pop(self):
# write code here
if self.stack:
if self.stack[-1]==self.minValue[-1]:#和上面不一样的地方
self.minValue.pop()
return self.stack.pop()
else:
return None
def top(self):
# write code here
return self.stack[-1]
def min(self):
# write code here
if self.minValue:
return self.minValue[-1]
else:
return None