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.
思路:这题如果直接用列表求min的方法的话,最后结果会报超时,所以应该声明一个min_value的变量,来存储链表的最小值,但是这里会遇到一个问题是,如果最小值被pop的话,如何设置min_value,以及多个最小值时pop的处理。
参考代码:
class MinStack:
def __init__(self):
self.stack, self.min = [], None
# @param x, an integer
# @return an integer
def push(self, x):
if not self.stack:
self.stack.append(0)
self.min = x
else:
self.stack.append(x - self.min)
if x < self.min:
self.min = x
# @return nothing
def pop(self):
x = self.stack.pop()
if x < 0:
self.min = self.min - x
# @return an integer
def top(self):
x = self.stack[-1]
if x > 0:
return x + self.min
else:
return self.min
# @return an integer
def getMin(self):
return self.min
这段代码是将列表当做栈来使用,列表中存储的是该数与之前数中最小数的差值,所以pop的操作是修改self.min,里面最有意思的是top的操作,由于栈中存储的不是真实的值,对于大于0的值,应该返回栈中的值加上self.min的结果,如果结果小于等于0的话,说明该值是之前所有值的最小值,直接返回self.min即可。