给定
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.length1 <= n <= 2 * 10^40 <= 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