【力扣155-最小栈】两种解法:借用辅助栈的双栈法、保存差值的单栈法(python3)

题目描述

https://leetcode-cn.com/problems/min-stack/

思路题解

此题不是要让手动实现栈,而是要让我们用一种简单快捷的方式快速提取出当前栈内所有元素的最小值。有两种方法,分别为借用辅助栈的双栈法和保存差值的单栈法。

方法一:借用辅助栈的双栈法

新开辟一个辅助栈smin,保存当前栈内的最小值。如果进行了pop操作,则smin内的元素也出栈。当有元素入栈时,即push操作,则同步加入新入栈元素x和辅助栈栈顶元素smin[-1]的最小值到辅助栈中。

代码如下:

class MinStack:

    def __init__(self):
        """
        initialize your data structure here.
        """
        self.stack=[]
        self.smin=[]
        self.smin.append(float("inf"))
        
    def push(self, x: int) -> None:
        self.stack.append(x)
        self.smin.append(min(x,self.smin[-1]))

    def pop(self) -> None:
        self.stack.pop()
        self.smin.pop()

    def top(self) -> int:
        if self.stack:return self.stack[-1]
        else:return []

    def getMin(self) -> int:
        if self.smin:return self.smin[-1]
        else:return []


# 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()

方法二:保存差值的单栈法

方法一的解题方式比较简单,但是空间上需要重新开辟一个栈。看到力扣评论区有人说面试中有的面试官会问不借用辅助栈的做法,遂方法二则为不借用辅助栈的方法。

  • diffdiff=x-self.min_value,保存新入栈的元素x与在此之前的最小值min_value的差
  • self.stack:当有新元素入栈后,保存所计算的diff的大小。
  • self.min_value:在进行任何的操作前,当前已有元素们的最小值。

下面以一个列子说明push操作的过程,假设先后入栈这几个元素:[-2,0,-3,-2]
在push时:

  • 如果当前栈为空,则入栈的元素为0,且置min_value=x,因为此时栈内无元素,谁入栈谁就是最小值;
  • 当栈不为空时,入栈的是x与在此之前的最小值min_value
    在这里插入图片描述
    在pop时:
  • diff<0,则证明当前保存的最小值min_value会发生变化,因为diff<0意味着这个要出栈的节点x是小于当时的min_value的,所以在入栈时min_value发生了更新,新的min_value就是x,栈内保存的是x与前一个min_value的差值。因此这里不仅要把min_value返回,还要重新更新下min_value=top-diff
  • diff>0,则证明pushx大于当时的min_value,所以x入栈后min_value也没有更新,栈内保存的是x与前一个min_value的差值,因此直接返回min_value + diff即可。
    在这里插入图片描述
    代码如下:
class MinStack:
    def __init__(self):
        """
        initialize your data structure here.
        """
        self.stack = []
        self.min_value = -1

    def push(self, x: int) -> None:
        if not self.stack:
            self.stack.append(0)
            self.min_value = x
        else:
            diff = x-self.min_value
            self.stack.append(diff)
            self.min_value = self.min_value if diff > 0 else x

    def pop(self) -> None:
        if self.stack:
            diff = self.stack.pop()
            if diff < 0:
                top = self.min_value
                self.min_value = top - diff
            else:
                top = self.min_value + diff
            return top

    def top(self) -> int:
        return self.min_value if self.stack[-1] < 0 else self.stack[-1] + self.min_value

    def getMin(self) -> int:
        return self.min_value if self.stack else -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()
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值