Leetcode刷题笔记40-最小栈

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.

猜你喜欢

转载自www.cnblogs.com/Joyce-song94/p/9193214.html