给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
和leetcode11盛水最多的容器.
分析:
使用单调栈。
def trap(self, height):
if len(height) <= 1:
return 0
res = 0
stk = []
for i in range(len(height)):
# 当当前元素比栈顶元素大时(维护非严格单调减)
while stk and height[i]>height[stk[-1]]:
cur = stk[-1]
stk.pop() # 删掉栈顶元素index
if 0 == len(stk): # 必须左边还有,才能计算红色部分的体积
break
# left和i取min
left = stk[-1]
h = min(height[i],height[left])-height[cur]
w = i-left-1
res += h*w
stk.append(i)
return res
or
for i in range(len(height)):
level = 0
while stk and height[stk[-1]]<=height[i]:
res += (height[stk[-1]]-level)*(i-stk[-1]-1)
level = height[stk[-1]]
stk.pop()
if stk:
res+=(height[i]-level)*(i-stk[-1]-1) # 这一句还是不明白?
stk.append(i)
return res