Design a stack that supports push, pop, top, and retrieving the minimum element in constant time.
- push(x) -- Push element x onto stack.
- pop() -- Removes the element on top of the stack.
- top() -- Get the top element.
- getMin() -- Retrieve the minimum element in the stack.
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.
LeetCode:链接
剑指offer同题:剑指Offer_编程题20:包含min函数的栈
设计一个栈(stack),使支持在常数时间内完成push,pop,top,获取最小元素getMin。
- push(x) – 将x入栈.
- pop() – 移除栈顶元素.
- top() – 获取栈顶元素.
- getMin() – 获取栈里最小元素.
此题的关键有两点:一是在常数时间内完成四种操作;二是要注意,压栈和出栈操作都可能更新栈里最小元素,尤其是出栈操作。在实现getMin函数时,为了避免超过常数时间的查询或搜索,所以需要以某种方式记录栈里最小值的历史信息。
定义两个栈,一个栈就是往里面push数,另一个存储的是最小值。
这个min函数就像栈的top函数一样,每调用一次top函数,得到的都是栈顶元素,同样,每调用一次min函数,得到的都是最小值!也就是说存储最小值的栈要和普通栈的长度一样,比如普通栈是[2,3,4,1],那么存储最小值的栈就是[2,2,2,1]。这样总共可以弹出四次最小值。
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 x < self.minstack[-1]:
self.minstack.append(x)
else:
self.minstack.append(self.minstack[-1])
def pop(self):
"""
:rtype: void
"""
if self.stack:
self.stack.pop()
self.minstack.pop()
def top(self):
"""
:rtype: int
"""
return self.stack[-1]
def getMin(self):
"""
:rtype: int
"""
return self.minstack[-1]
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(x)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()