题目描述:
定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应该为O(1) )。在该栈中,调用min、push、pop的时间复杂度都是O(1)
一步步出坑:
异想天开一:看到这种题目,第一反应可能是每次压入一个新元素的进栈时,将栈里的所有元素排序,让最小元素位于栈顶,这样就可以在O(1)时间内得到最小元素了。但是请问这样的数据结构还叫栈吗?
异想天开二:在栈里添加一个成员变量存放最小的元素,每次压栈新元素的时候,如果该元素比最小元素小,那么更新最小元素为当前元素。那么如果当前最小的元素被弹栈后,如何得到下一个最小的元素呢?
思路:
可以考虑使用一个辅助栈,当有新元素压入数据栈的时候,比较新元素与辅助栈中的最小元素两者得到较小者,然后将较小者压入辅助栈中,最终当前数据栈的最小值一定位于辅助栈栈顶。注意,当有弹栈操作时,辅助栈同样也要进行弹栈。
代码实现
class Stack:
def __init__(self):
self.stack = []
self.minStack = []
def push(self, node):
self.stack.append(node)
if len(self.minStack) == 0 or node < self.minStack[-1]:
self.minStack.append(node)
else:
self.minStack.append(self.minStack[-1])
def pop(self):
tmp = self.stack[-1]
self.stack = self.stack[:-1]
self.minStack = self.minStack[:-1]
return tmp
def top(self):
return self.stack[-1]
def min(self):
if len(self.minStack):
return self.minStack[-1]
else:
return None