问题三:如何用O(1)的时间复杂度求栈中最小的元素
一般求一个数组,一个列表中的最值问题,我们第一反应是遍历。但是题中要求了O(1)的时间复杂度,那我们就不能采用遍历的方法,以为遍历的通常是O(N)。为了降低时间复杂度,我们就要用空间换时间。建立一个新的栈,专门用来放每次有元素入栈时的最值,最后输出最值栈的栈顶,时间复杂度满足要求。
class Stack():
def __init__(self):
self.items=[]
def is_empty(self):
return len(self.items)==0
def push(self,data):
self.items.append(data)
def peek(self):
if self.is_empty():
return None
else:
return self.items[len(self.items)-1]
def pop(self):
return self.items.pop()
class Mystack():
def __init__(self):
self.emstack=Stack()
self.minstack=Stack()##栈顶永远存储当前emstack中最小的元素
def empush(self,data):
self.emstack.push(data)
if self.minstack.is_empty():
self.minstack.push(data)
else:
if data<self.minstack.peek():
self.minstack.push(data)
def pop(self):
top=self.emstack.peek()
self.emstack.pop()
if top ==self.minsput():
self.minstack.pop()
return top
def minsput(self):
if self.minstack.is_empty():
return 2**32
else:
return self.minstack.peek()
if __name__=="main":
s=Mystack()
s.empush(5)
s.empush(6)
s.empush(7)
s.minsput()