【leetcode100】最小栈

1、题目描述

设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。

实现 MinStack 类:

  • MinStack() 初始化堆栈对象。
  • void push(int val) 将元素val推入堆栈。
  • void pop() 删除堆栈顶部的元素。
  • int top() 获取堆栈顶部的元素。
  • int getMin() 获取堆栈中的最小元素。

示例 1:

输入:
["MinStack","push","push","push","getMin","pop","top","getMin"]
[[],[-2],[0],[-3],[],[],[],[]]

输出:
[null,null,null,null,-3,null,0,-2]

2、初始思路

2.1 思路

对于栈和队列,都是基于列表,实现列表的特殊操作。

栈为先进后出,队列为先进先出

对于最小栈,可以新建一个minstack,用来存储最小的元素,比如,当当前值<=最小栈栈顶元素时,可以将该元素入栈。

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

当实行pop操作时,此时要注意,由于有些元素并未加入最小栈中,因此只有当栈的栈顶元素与最小栈的栈顶元素相同时,最小栈才需要实行pop操作。

def pop(self) -> None:
    if self.stack:
        if self.minstack and self.stack[-1] == self.minstack[-1]:
            self.minstack.pop()
        self.stack.pop()

栈的栈顶元素即为最后入栈的元素,也就是列表中的最后一个元素

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

同理,由于按照递减的操作进行最小栈的入栈操作,最小栈的栈顶元素即为最小元素。

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

2.2 完整代码

class MinStack:

    def __init__(self):
        self.stack = []
        self.minstack = []

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

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

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


# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(val)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SsummerC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值