题面:
算是单调栈的经典题目吧,但我觉得还是有一定的思维含量在里边。
做法:
首先维护一个类似下图中的单调栈。
接下来我们可以考虑类似按高度分层的方法来计算能够接的雨水量。例如出现一个直方其高度为h1比当前栈顶的直方h2要高的话,那么就将h2出栈,如果此时栈不为空且栈顶的直方高度为h3的话,那么此时对答案的贡献为(min(h1,h3)-h2)*w,w表示h1到h3之间的宽度。
代码:
class Solution:
def trap(self, height: List[int]) -> int:
stk=list()
ans=0
for i in range(len(height)):
while stk and height[stk[-1]]<height[i]:
idx=stk.pop()
if stk:
ans+=(min(height[i],height[stk[-1]])-height[idx])*(i-stk[-1]-1)
stk.append(i)
return ans