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
# 暴力法,当前位置 与 其左右最大值的最小值 之差
def trap(height):
if not height:
return 0
ans = 0
for i in range(1,len(height)):
maxleft,maxright = 0,0
for j in range(i+1):
maxleft = max(maxleft,height[j])
for j in range(i,len(height)):
maxright = max(maxright,height[j])
ans += min(maxleft,maxright)-height[i]
return ans
#动态编程 存储最大值
def trap(height):
if not height:
return 0
ans = 0
maxleft,maxright = [0]*len(height),[0]*len(height)
maxleft[0] = height[0]
maxright[-1] = height[-1]
for i in range(1,len(height)):
maxleft[i] = max(maxleft[i-1],height[i])
for i in range(len(height)-2,-1,-1):
maxright[i] = max(maxright[i+1],height[i])
for i in range(1,len(height)):
ans += min(maxleft[i],maxright[i])-height[i]
return ans,maxleft,maxright
# 双指针 一次遍历
def trap(height):
ans = 0
left,right = 0,len(height)-1
leftmax,rightmax = 0,0
while left<right:
if height[left] < height[right]:
if height[left] > leftmax:
leftmax = height[left]
else:
ans += leftmax - height[left]
left += 1
else:
if height[right] > rightmax:
rightmax = height[right]
else:
ans += rightmax - height[right]
right -= 1
return ans