单调栈 时间复杂度O(N)

class Solution:
def trap(self, height: List[int]) -> int:
indexStack = []
sum = 0
for i in range(len(height)):
while indexStack and height[i] > height[indexStack[-1]]:
bottom = indexStack.pop()
# 如果退栈之后栈为空 则没有左边界 不会有积水
if not indexStack:
break
left = indexStack[-1]
# 两墙之间的宽度 * (两墙最小高度 - 弹出的底部的高度)
sum += (i - left - 1) * (min(height[i], height[left]) - height[bottom])
indexStack.append(i)
return sum ```