题目描述:用O(1)的时间复杂度求最小元素。
在算法的设计当中,经常采用空间换时间的方式来提高时间复杂度,也就是用额外的存储空间来降低操作的时间复杂度。
解题思路:如果当前入栈的元素比原来栈中的元素最小值还要小,则把这个值压入保存最小值元素的栈中;在出栈的时候,如果当前的元素恰好等于当前栈中的那个最小值,保存最先值得栈顶元素也出栈,使当前最小值变为当前最小值入栈之前的那个最小值。
class Stack:
def __init__(self):
self.items = []
def empty(self):
"""判断栈是否为空"""
return len(self.items) == 0
def size(self):
"""栈的大小"""
return len(self.items)
def peek(self):
"""返回栈顶元素"""
if not self.empty():
return self.items[len(self.items) - 1]
else:
return None
def pop(self):
"""弹栈"""
if len(self.items) > 0:
return self.items.pop()
else:
print("栈空")
def push(self, items):
"""压栈"""
self.items.append(items)
class MyStack:
def __init__(self):
self.elemStack = Stack() # 用来存储栈中元素
self.minStack = Stack() # 栈顶永远存储当前elemStack中最小的值
def push(self, data):
self.elemStack.push(data)
# 更新保存最小元素的栈
if self.minStack.empty():
self.minStack.push(data)
else:
if data < self.minStack.peek():
self.minStack.push(data)
def pop(self):
topData = self.elemStack.peek()
self.elemStack.pop()
if topData == self.mins():
self.minStack.pop()
return topData
def mins(self):
if self.minStack.empty():
return 2 ** 32
else:
return self.minStack.peek()
if __name__ == "__main__":
stack = MyStack()
stack.push(7)
print("栈中最小值为:" + str(stack.mins()))
stack.push(5)
print("栈中最小值为:" + str(stack.mins()))
stack.push(6)
print("栈中最小值为:" + str(stack.mins()))
stack.push(2)
print("栈中最小值为:" + str(stack.mins()))