leetcode 42.接雨水 单调栈笔记(基于灵茶山艾府大神)

class Solution:
    def trap(self, height: List[int]) -> int:
        ans = 0
        st = []
        for i, h in enumerate(height):  # enumerate的输出带有index(i)和value(h)
            while st and h >= height[st[-1]]:   # 这是单调递增栈,也就是图中5210到4时,4大于上一个栈顶的数值(0),于是执行该while语句
                bottom_h = height[st.pop()]     # 当前栈顶(举例为图中数字2)的数值赋值为bottom_h
                if not st:  # len(st) == 0      # 如果栈为空跳出while循环,将数值入栈
                    break
                left = st[-1]   # 将栈顶的下一个数值(举例为图中数字5)赋值给left指针
                dh = min(height[left], h) - bottom_h  # 面积的高 (举例取图中数字5和4最小的那位,再减去栈顶数值2)
                ans += dh * (i - left - 1)  # 上面得到的高乘水柱宽度(当前index减去left指针再减1(宽度)得到水柱宽度)
            st.append(i)    # 将数值加入栈里(关于单调递增栈我们要知道,如果要加入的数值比栈顶数值大,需要将栈顶数值弹出后再执行入栈)
        return ans

以上代码与图片均来自灵茶山艾府,我在代码上加了注释和图片上指出代码中的变量,发笔记时为了Mark一下现在的理解

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值