42. 接雨水

题目描述

柱子的宽度是1,高度存在数组中,问如果按照此排列,下雨后能接多少雨水

f1-单调栈

基本分析

  1. 要计算能存雨量,需要左边界的高度>=当前标高,需要用什么结构来维护?结构是单调的
  2. 又由于可能当前标高是逐渐递增考虑的,不是只计算一次,结构需要从右边添加或者右边弹出?栈
  3. 用单调栈怎么模拟计算的过程?(1)追加元素的情况:栈是空或者栈追加i处的索引后,依然满足单调递减,就一直追加;(2)计算答案的情况:否则就要把栈顶的top弹出来,计算以st[-1]为左边界,h[top]为底,i为右边界的区间的面积;计算完以后如果还是满足while的条件,就继续弹出重复操作;(3)为什么栈空的时候有个break?此刻没有左边界了,肯定不用再考虑

代码

class Solution:
    def trap(self, height: List[int]) -> int:
        ans = 0
        st = []

        for i, h in enumerate(height):
            while st and height[st[-1]] < h:
                cur = st.pop()
                if not st:
                    break
                left = st[-1]
                w = i - left - 1
                d = min(height[left], h) - height[cur]
                ans += w * d
            st.append(i)
        
        return ans

总结

  1. 栈内存的是索引,索引对应的值是单调递减的(非严格,可以=)
  2. 弹出和插入的操作都是在右边完成的

其他方法:待补充

posted @ 2023-03-18 11:09  zhangk1988  阅读(46)  评论(0)    收藏  举报