Day4 难度:困难
题干:
给定 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
思路:
产生凹陷的地方才能存储雨水,那么高度一定是先减后增,所以思路就是维护一个高度递减的栈
步骤:
① 设置一个高度递减的栈
② 找出先增后减的转折点的位置
③ 求出那部分凹陷的面积
④ 遍历,继续求出其他的面积
代码:
class Solution:
def trap(self, height: List[int]) -> int:
length=len(height)
if length < 3:
return 0
res = 0
# 设置一个高度递减的栈
stack=[]
for index in range(0, length): # 遍历index
while len(stack)>0 and height[index] > height[stack[-1]]: # 当栈>0并且index位置的值>栈里最后的一个元素的值
top=stack.pop() # 弹出栈中最后一个元素
if len(stack) == 0:
break
h = min(height[stack[-1]], height[index]) - height[top] # 计算凹陷的高度
dist = index - stack[-1] - 1 # 计算凹陷的宽度
res += (dist * h) # 求出存水的量
stack.append(index)
return res
大家可以根据思路,自己敲敲代码,有不明白的留言问我哦~