设计一个栈,该栈可以进行push、pop、top和在常数时间内检索最小值的操作
- push(x) -- 压一个数到栈顶
- pop() -- 移除栈顶的元素,不返回任何对象
- top() -- 返回栈顶端的元素
- getMin() -- 检索栈中的最小值
Example:
MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> Returns -3. minStack.pop(); minStack.top(); --> Returns 0. minStack.getMin(); --> Returns -2.
1:用列表模拟栈,push、pop、top和getMin分别对应list.append()、list.pop()、list[-1]和min()操作
class MinStack(object):
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = []
def push(self, x):
"""
:type x: int
:rtype: void
"""
self.stack.append(x)
def pop(self):
"""
:rtype: void
"""
self.stack.pop()
def top(self):
"""
:rtype: int
"""
return self.stack[-1]
def getMin(self):
"""
:rtype: int
"""
return min(self.stack)
2:由于题中要求在常数时间内检索栈中最小值,而min()消耗时间比较长,所以引入minStack列表存放最小值(参考他人代码)
class MinStack(object):
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = [] #存放所有元素
self.minStack = []#存放每一次压入数据时,栈中的最小值(如果压入数据的值大于栈中的最小值就不需要重复压入最小值,小于或者等于栈中最小值则需要压入)
def push(self, x):
"""
:type x: int
:rtype: void
"""
self.stack.append(x)
if not self.minStack or self.minStack[-1]>=x:
self.minStack.append(x)
def pop(self): #移除栈顶元素时,判断是否移除栈中最小值
"""
:rtype: void
"""
if self.minStack[-1]==self.stack[-1]:
del self.minStack[-1]
self.stack.pop()
def top(self):
"""
:rtype: int
"""
return self.stack[-1]
def getMin(self):
"""
:rtype: int
"""
return self.minStack[-1]
算法题来自:https://leetcode-cn.com/problems/min-stack/description/