leetcode 155. Min Stack 双栈 python3

一.问题描述

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.

二.解题思路

一开始题目没看清楚,以为是写最小堆来着,写着写着才发现是最小栈,把我给整懵逼了。

栈是先进后出结构,pop push top这些操作没啥好说的。

主要是题目要求求栈最小值的时候要常数时间,注意栈是从空开始慢慢生成。

考虑到pop,push操作都是在末尾添加或者删除元素,

那么就可以开另外一个栈记录目前栈在每个状态下的最小值,就是在不同长度,比如说i,i+1,i+2 随着push函数或者pop函数的进行,栈的长度是有变换的。

不能只用一个值来记录最小值,因为pop操作可能会将你目前记录的最小值删掉,然后就没了。

所以我们必须记录的是整个一个变化过程(push操作,使得栈元素增加)的最小值的变化,这样即使后面pop操作可能把我们当前的最小值给删掉了,我们可以通过最小值栈来找到上一个最小值。

最小值栈和原始的数据栈记得要同步pop和push。最小值栈push的是原始栈当前待添加的值和最小值栈之前的最小值中较小的哪一个。

进一步思考你会发现,

我们不需要记录栈的每个变化长度下的最小值,比如0~1,0~2,0~3,0~n下栈的最小值,只需要记录最小值的变化记录就可以了。

因为你会发现,只要原始栈目前pop的元素值不是当前最小值,对跟踪最小值没有影响,我们不需要处理最小值栈,而仅当原始栈目前pop的元素是当前的最小值的时候,我们需要把最小值栈也跟着pop。

可以这样理解,当原始栈pop的值刚好是最小值的时候,假设这时候pop元素的索引是i,因此我们现在需要知道栈0~i-1的最小值,我们可以对栈在每个状态(每个长度)下的最小值都记录下来,这样我们当然知道栈0~i-1的最小值(类似动态规划),但是其实这就是找最小值的一个变化(当前最小值被pop了,我要找第二小的了)因此我们只需要记录最小值的变化就行了。

更多leetcode算法题解法: 专栏 leetcode算法从零到结束

三.源码

class MinStack:
#50
    def __init__(self):
        """
        initialize your data structure here.
        """
        self.stack=[]
        self.min_stack=[]

    def push(self, x: int) -> None:
        self.stack.append(x)
        if not self.min_stack or self.min_stack[-1]>=x:
            self.min_stack.append(x)

    def pop(self) -> None:
        if self.stack[-1]==self.min_stack[-1]:
            self.min_stack.pop()
        self.stack.pop()
        
    def top(self) -> int:
        return self.stack[-1]

    def getMin(self) -> int:
        return self.min_stack[-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()
发布了218 篇原创文章 · 获赞 191 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/CSerwangjun/article/details/103360283