原题地址42. 接雨水
给定 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
算法
用数组 value 记录比 value[0] 低的部分。从左向右遍历,若当前点 height[i] 不低于 value[0] ,计算 value 中所有数值变为 value[0] 所带来的雨水量,重置 value 为 [height[i]] ;若 height[i] 低于 value[0] ,则加入 value 。遍历结束后将剩下的 value 逆序再进行以上操作。
代码
def fun(height):
"""
:type height: List[int]
:rtype: int
"""
def back(s):
if len(s) <= 2:
return 0
value = []
ans = 0
for i, key in enumerate(s):
if len(value) > 0 and key >= value[0]:
ans += len(value) * value[0] - sum(value)
value = [key]
else:
value.append(key)
value.reverse()
return ans + back(value)
return back(height)