day42-数据结构力扣

42. 接雨水

题目链接 42. 接雨水 - 力扣(LeetCode)

思路

按照这个方向来计算雨水

还是采用单调栈的方法求解

只有凹下去的地方才能接水 也就是:中间低,左右两边高,才能存水。

单调栈怎么用?

  1. 栈存下标 ,保持栈内高度单调递减

  2. 遇到一个比栈顶高的柱子 → 说明形成凹槽,可以接水!

  3. 弹出栈顶,这个位置就是底部

  4. 新栈顶 = 左边界 ,当前元素 = 右边界

  5. 接水量 = 宽度 × (左右边界较小值 - 底部高度)

公式

雨水宽度 = 当前下标 - 新栈顶下标 - 1

高度 = min(左高, 右高) - 底部高度

总雨水量 += 宽度 × 高度

这里画了一次,栈里面存的是下标。30比10大,10的下标3弹出,下标2是新的栈顶元素

然后右边是计算公式伪代码,h,w计算公式可以直接看下面的提交,stack-1可能好理解一些

提交

python 复制代码
class Solution:
    def trap(self, height: List[int]) -> int:
        stack = []  # 存下标,保持高度递减
        res = 0
        n = len(height)
        
        for i in range(n):
            # 当前高度 > 栈顶高度 → 可以接水
            while stack and height[i] > height[stack[-1]]:
                # 凹槽底部
                bottom = stack.pop()
                if not stack:
                    break
                
                # 计算宽和高
                w = i - stack[-1] - 1
                h = min(height[i], height[stack[-1]]) - height[bottom]
                
                res += w * h
            
            stack.append(i)
        
        return res

84. 柱状图中最大的矩形

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

思路

跟上题差不多,只是递增

找到这个柱子,左边第一个比他小的,右边第一个比他小的

宽就是这个柱子可以拓展的宽度

高就是这个柱子自己的高度

提交

python 复制代码
class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        stack = []  # 存下标,高度递增
        max_area = 0
        n = len(heights)
        
        for i in range(n):
            # 当前高度 < 栈顶高度 → 栈顶找到右边界
            while stack and heights[i] < heights[stack[-1]]:
                # 弹出:作为矩形高度
                h_idx = stack.pop()
                h = heights[h_idx]
                
                # 左边界:栈空则为 -1,否则为新栈顶
                left = stack[-1] if stack else -1
                # 宽度
                w = i - left - 1
                # 面积
                max_area = max(max_area, h * w)
            
            stack.append(i)
        
        # 处理栈中剩余元素(右边界 = n)
        while stack:
            h_idx = stack.pop()
            h = heights[h_idx]
            left = stack[-1] if stack else -1
            w = n - left - 1
            max_area = max(max_area, h * w)
        
        return max_area
相关推荐
Doubbbbbbble云11 小时前
区间合并问题的常见算法模式与优化思路4
java·数据结构·算法
David猪大卫11 小时前
【C++修炼】哈希表的实现
数据结构·c++·笔记·学习·算法·哈希算法·散列表
linx29513 小时前
单元九 · 零基础路线图-第 7–9 周·类与 RAII
c语言·开发语言·数据结构·c++·嵌入式硬件·算法
布莱克60513 小时前
C++ 七大排序算法详解:选择、冒泡、插入、计数、堆、快速与归并排序
数据结构·c++·算法·排序算法
科学实验家14 小时前
最小生成树:Prim,kruskal
数据结构·c++·算法
小孩玩什么15 小时前
深入理解字符串匹配算法:BF算法,KMP算法
java·c语言·开发语言·数据结构·c++·算法
淡海水16 小时前
10-05-高级-模式匹配-CSharp如何改变与数据结构的交互方式
数据结构·算法·c#·模式匹配
蓝速科技17 小时前
蓝速科技 F100 双屏翻译机:中小企业跨国会议提效方案
大数据·网络·数据结构·人工智能·科技·运维开发
keyipatience18 小时前
5种IO模型与阻塞IO,select,poll,epoll,LT和ET模式
linux·服务器·网络·数据结构·c++·算法
彧azz1 天前
图的存储结构详解:邻接矩阵的原理、实现与应用
开发语言·数据结构·学习·php