给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。
示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
思路
先统计每个位置左侧柱子的最大值,再统计每个位置右侧柱子的最大值,两者中最小的那个即为当前位置水面能达到的最高高度,减去当前位置水的高度就是水的体积
代码
def trap(self, height):
if(height==[]):return 0
n=len(height)
l_left=[0]*n
l_left[0]=height[0]
l_right=[0]*n
l_right[-1]=height[-1]
for i in range(1,n):
l_left[i]=(max(height[i],l_left[i-1]))
for i in range(n-2,-1,-1):
l_right[i]=(max(height[i],l_right[i+1]))
s=0
for i in range(0,n):
s=s+min(l_left[i],l_right[i])-height[i]
return s