1. 题目
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
- push(x) -- 将元素 x 推入栈中。
- pop() -- 删除栈顶的元素。
- top() -- 获取栈顶元素。
- getMin() -- 检索栈中的最小元素。
示例:
MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin(); --> 返回 -2.
2. 解答
python3
思路:使用2个栈,其中一个专门用来记录最小值。
class MinStack: def __init__(self): self.stack = [] self.minStack = [] def push(self, x): self.stack.append(x) if len(self.minStack) == 0 or x <= self.minStack[-1]: self.minStack.append(x) def pop(self): if self.top() == self.getMin(): self.minStack.pop() return self.stack.pop() def top(self): return self.stack[-1] def getMin(self): 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()
3. 优答
思路1:
只用1个栈,用一个变量min_val记录当前的最小值,将当前最小值一同入栈,为节省空间,仅在当前最小值更改时才入栈。所以该栈的push和pop实际上可能是两次。当新进来的数小于min_val时,把当前的min_val和新进来的数一起推入到栈,min_val变为这个新进来的数。当pop栈顶元素的时候,如果栈顶元素的值和min_val相等,那么就把它下面记录的之前最小值赋给min_val并弹出。
class MinStack(object): def __init__(self): self.min = 2147483647 self.stack = [] def push(self, x): if x <= self.min: self.stack.append(self.min) self.min = x self.stack.append(x) def pop(self): peak = self.stack.pop() if peak == self.min: self.min = self.stack.pop() def top(self): return self.stack[-1] def getMin(self): return self.min
思路2:
栈中当前值与最小值的差,用一个元素来记录,然后根据这个值可以计算出当前值和最小值。当栈顶元素为正时,表示当前元素比最小元素大,当前值为最小值+差值;当栈顶元素为负时,其表示的是当前元素值比之前最小值小,现在的最小值就是元素值。
class MinStack(object): def __init__(self): self.min = 2147483648 self.stack = [] def push(self, x): if not self.stack: self.min = x self.stack.append(x - self.min) if x < self.min: self.min = x def pop(self): peak = self.stack.pop() if peak < 0: self.min = self.min - peak def top(self): if self.stack[-1] < 0: return self.min else: return self.min + self.stack[-1] def getMin(self): return self.min
这两个方法还没有仔细研究,参考的博客https://www.cnblogs.com/lightwindy/p/8512214.html
设计一个支持 push,pop,top 操作,并能在常数时间内检索到最小元素的栈。
- push(x) -- 将元素 x 推入栈中。
- pop() -- 删除栈顶的元素。
- top() -- 获取栈顶元素。
- getMin() -- 检索栈中的最小元素。
示例:
MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); --> 返回 -3. minStack.pop(); minStack.top(); --> 返回 0. minStack.getMin(); --> 返回 -2.