Day10-Min Stack
问题描述:
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:
Input
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]
Output
[null,null,null,null,-3,null,0,-2]
Explanation
MinStack minStack = new MinStack();
minStack.push(-2);
minStack.push(0);
minStack.push(-3);
minStack.getMin(); // return -3
minStack.pop();
minStack.top(); // return 0
minStack.getMin(); // return -2
解法:
一开始想用一个变量记录当前栈中的最小值,但是想到pop()函数时这个变量的变化问题没法弄啊所以就又想用两个变量记录最小和第二小的值,当pop()出来的数等于最小值时,我们可以让最小值等于第二小的值,但是与此同时第二小的值又该怎么变呢。。。所以用变量来做就行不通了吧。然后看了提示后说可以用额外的一个栈记录每个位置的最小值才有所感悟。
设置额外的一个栈记录每个位置的最小值,这个当pop()时pop()最小值栈顶的元素就行了,当push时检测最小值栈顶的元素和当前值的大小,将小的值推入最小值栈顶。
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = []
self.min = []#设置一个数组存储每一个节点的最小值
def push(self, x: int) -> None:
self.stack.append(x)
if len(self.min):
x = min(self.min[-1],x)
self.min.append(x)
def pop(self) -> None:
self.stack.pop()
self.min.pop()
def top(self) -> int:
return self.stack[-1]
def getMin(self) -> int:
return self.min[-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()