42. 接雨水

88 阅读1分钟

42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例 1:

输入: height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
解释: 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 

示例 2:

输入: height = [4,2,0,3,2,5]
输出: 9

提示:

  • n == height.length
  • 1 <= n <= 2 * 10^4
  • 0 <= height[i] <= 10^5

代码

1.前后缀分解

# 这题有多种解法,双指针还没学会,这里学习灵神的前后缀分解
def trap(height):
    n = len(height)
    pre = [0 for _ in range(n)] # pre[i]表示i之前包括i的最大值
    pre[0] = height[0]
    for i in range(1,n):
        pre[i] = max(pre[i-1] ,height[i])

    suf = [0 for _ in range(n)] #suf[j]表示j之后包括j的最大值
    suf[-1] = height[-1] # 从背后往前算
    for j in range(n-2, -1, -1):
        suf[j] = max(suf[j+1] ,height[j])

    ans = 0
    for h,p,s in zip(height ,pre ,suf):
        # 高度前后栏板较小值再除去当前底部高度,宽度是单位1
        real_h = min(p ,s) - h
        ans += real_h
    return ans