hot100-栈

20. 有效的括号

20. 有效的括号 - 力扣(LeetCode)

python 复制代码
class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        if len(s)%2:
            return False
        st = []
        d = {
            ")":"(",
            "]":"[",
            "}":"{",
        }
        for c in s:
            if c not in d:
                st.append(c)
            elif st and st[-1]==d[c]:
                st.pop()
            else:
                return False
        return not st

时间复杂度:O(n)

空间复杂度:O(n+∣Σ∣) # 其中 Σ 表示字符集,是哈希表的大小。

155. 最小栈

155. 最小栈 - 力扣(LeetCode)

利用辅助栈存储最小元素,每当进入一个元素,就统计当前的min加入辅助栈;每当删除一个元素,就同步删除;辅助栈的每个元素代表到当前节点为止所有的最小元素【初始化一个-inf】

python 复制代码
class MinStack(object):
    def __init__(self):
        self.stack = []
        self.min_stack = [float('inf')]
        
    def push(self, val):
        """
        :type val: int
        :rtype: None
        """
        self.stack.append(val)
        self.min_stack.append(min(val,self.min_stack[-1]))
        
    def pop(self):
        """
        :rtype: None
        """
        self.stack.pop()
        self.min_stack.pop()
        
    def top(self):
        """
        :rtype: int
        """
        return self.stack[-1]
        
    def getMin(self):
        """
        :rtype: int
        """
        return self.min_stack[-1]

所有操作的时间复杂度:O(1)

空间复杂度:O(n)

394. 字符串解码

394. 字符串解码 - 力扣(LeetCode)

python 复制代码
class Solution(object):
    def decodeString(self, s):
        """
        :type s: str
        :rtype: str
        """
        st = []
        for c in s:
            if c.isdigit() or c.isalpha() or c=='[':
                st.append(c)
            else:
                # c==']'
                sub = ''
                while st and st[-1].isalpha():
                    # 栈顶元素最后一个元素防报错
                    sub = st.pop()+sub  # 保持原有顺序
                st.pop()  # 弹出[
                num,d = 0,0
                while st and st[-1].isdigit():
                    num += (int(st.pop()) * (10**d))
                    d += 1
                sub = sub*num
                st.append(sub)
        return ''.join(st)

时间复杂度:O(n+S) # 解码后得到的字符串长度为S,而且其实更多的由S决定

空间复杂度:O(S) #栈中存储了中间结果,包括字母片段和数字,最终也会逐步累积成完整的解码字符串。在最坏情况下,栈内元素的总字符数接近最终结果的长度。

739. 每日温度

739. 每日温度 - 力扣(LeetCode)

单调栈

Day47-单调栈-CSDN博客

Day48-单调栈-CSDN博客

可以维护一个存储下标的单调栈,从栈底到栈顶的下标对应的温度列表中的数值递减。

也就是说,对于每一个栈顶元素-1,-2的位置对应的温度会更高。【-1没有找到下一个最大元素前,-2绝对不会找到,仅仅对比栈顶即可】

当一个新的元素入栈前,如果比当前的栈顶元素来得高,那么栈顶元素对应的下一个最大元素就找到了。

python 复制代码
class Solution(object):
    def dailyTemperatures(self, temperatures):
        res = [0 for _ in temperatures]
        st = []
        for i in range(len(temperatures)):
            while st and temperatures[i]>temperatures[st[-1]]:
                cur = st.pop()
                res[cur] = i-cur
            st.append(i)
        return res

时间复杂度:O(n) # 对于温度列表中的每个下标,最多有一次进栈和出栈的操作。

空间复杂度:O(n) # 最差的情况就是其栈的大小恰好等于n【单调递减】

84. 柱状图中的最大矩形

84. 柱状图中最大的矩形 - 力扣(LeetCode)

维护一个存储下标的单调栈,从栈底到栈顶的下标对应的列表中的数值递增。

也就是说,对于每一个栈顶元素-1,-2的位置对应的柱子会更低。

每当我们找到了一个比栈顶元素小的元素,那么对于栈顶元素,倒数第二个元素和未入栈的元素是比当前元素小的元素,那么要算以当前栈顶元素为高的最大面积就是中间的间隔*栈顶元素的高度。

python 复制代码
class Solution(object):
    def largestRectangleArea(self, heights):
        """
        :type heights: List[int]
        :rtype: int
        """
        heights =[0] + heights + [0]  # 开始加0,是为了左边界不需要额外判断,右边界加0,是为了处理单调递增的数组情形
        res = []  # 存储的是以每个柱子的高度所能达到的最大矩形面积
        st = []  # 单调递增栈,栈底元素 -> 栈顶元素 递增(不递减)
        for i in range(len(heights)):
            while st and heights[i]<heights[st[-1]]:
                cur = st.pop()
                if not st:
                    # 没有元素说明cur作为左边界已经在上一轮完成了计算,栈中无元素,可以跳出while
                    break
                left = st[-1]
                s = heights[cur]*(i-left-1)  # 右边小元素-左边小元素-1 就是当前柱子高度可以覆盖的最大宽度
                res.append(s)
            st.append(i)
        return max(res) if res else 0

时间复杂度:O(n) # 对于每个下标,最多有一次进栈和出栈的操作。

空间复杂度:O(n) # 最差的情况就是其栈的大小恰好等于n【单调递增】

相关推荐
8Qi8几秒前
LeetCode 115 & 392:不同子序列 / 判断子序列
算法·leetcode·职场和发展·动态规划
Sammyyyyy10 分钟前
Google I/O 2026 Antigravity 更新解析与 SDK 实战指南
python·ai编程·servbay
小蒋学算法20 分钟前
算法-乘法表中第K小的数-二分
数据结构·算法
智者知已应修善业28 分钟前
【51单片机8个LED,已经使用了D1D2,怎么样在不动D1D2的前提下实现D6~D8的流水灯】2024-1-19
c++·经验分享·笔记·算法·51单片机
Evand J30 分钟前
【MATLAB例程】自适应渐消扩展卡尔曼滤波(AFEKF)三维雷达目标跟踪|效果已调优,附下载链接和运行结果,代码直接运行即可
开发语言·算法·matlab·目标跟踪·卡尔曼滤波·自适应滤波·代码定制
嫂子的姐夫32 分钟前
047-MD5:飞卢网
爬虫·python·js逆向·逆向
DXM052137 分钟前
第8期| 传统机器学习遥感解译:SVM & 随机森林分类全流程实操
人工智能·python·随机森林·机器学习·支持向量机·arcgis·自然语言处理
装不满的克莱因瓶37 分钟前
深入PyTorch模型的训练与可视化 —— 掌握迁移学习等模型训练效果提升的办法
人工智能·pytorch·python·深度学习·神经网络·ai·迁移学习
无心水44 分钟前
【OpenClaw:赚钱】案例19、内容产量5倍、广告收入翻4倍:播客转多平台内容矩阵全自动化实战(OpenAI Whisper + Claude)
java·人工智能·python·ai编程·openclaw·养龙虾·java.time
逗逗班学Python1 小时前
基于 Faster-Whisper 的本地语音转字幕与会议纪要系统:从音频转写到 SRT 字幕与 Markdown 纪要完整项目实战
python·语音识别·faster-whisper·字幕生成·会议纪要