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【单调递增】

相关推荐
fengxin_rou2 分钟前
一文读懂 Redis 集群:从哈希槽到透明访问
java·数据库·redis·算法·spring·缓存
DeepModel7 分钟前
【概率分布】t分布详解
算法·概率论
CoovallyAIHub11 分钟前
ICLR 2026 | 慕尼黑工大院士Navab团队联合MVTec提出FoundAD,用基础视觉编码器实现少样本异常检测
人工智能·算法·计算机视觉
仰泳的熊猫11 分钟前
题目2266:蓝桥杯2015年第六届真题-打印大X
数据结构·c++·算法·蓝桥杯
wefg127 分钟前
【算法】约数个数、约数和
算法
所谓伊人,在水一方33327 分钟前
【Python数据科学实战之路】第5章 | 数据可视化基础:用Matplotlib讲好数据故事
python·信息可视化·matplotlib
cui_ruicheng30 分钟前
C++ 数据结构:AVL树原理与实现
数据结构·c++
波哥学开发37 分钟前
自动驾驶必备:全面解析鱼眼相机投影模型(UCM/KB/DS)及实战代码
算法
云泽80840 分钟前
蓝桥杯算法精讲:二分算法之二分答案深度剖析
算法·蓝桥杯
小龙报42 分钟前
【数据结构与算法】环与相遇:链表带环问题的底层逻辑与工程实现
c语言·数据结构·c++·物联网·算法·链表·visualstudio