题目
给定 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
【分析】动态编程。
left_max记录从index=i到最左边最高的height之间的距离
right_max记录从index到最右边最高的height之间的距离
中间利用left和right记录临时的最高height。
class Solution(object):
def trap(self, height):
"""
:type height: List[int]
:rtype: int
"""
n=len(height)
left,right=0,0
left_max,right_max=range(n),range(n)
for i in range(n):
if left<height[i]:
left=height[i]
left_max[i]=left-height[i]
if right<height[n-i-1]:
right=height[n-i-1]
right_max[n-i-1]=right-height[n-i-1]
return sum([min(right_max[i],left_max[i]) for i in range(n)])
【分析2】利用单调减栈,计算凹槽的面积。
栈内存入height的index。
1.维护栈单调递减的原则,如果遇到height比栈中的height大的情况,弹出栈中元素,作为凹槽底的高度bottom=stack.pop()
2.计入面积的高度,min(height[i],height[stack[-1]])-height[bottom]
3.计入面积的宽度,i-stack[i]-1