class Solution:
def trap(self, height: List[int]) -> int:
ans = 0
st = []
for i, h in enumerate(height): # enumerate的输出带有index(i)和value(h)
while st and h >= height[st[-1]]: # 这是单调递增栈,也就是图中5210到4时,4大于上一个栈顶的数值(0),于是执行该while语句
bottom_h = height[st.pop()] # 当前栈顶(举例为图中数字2)的数值赋值为bottom_h
if not st: # len(st) == 0 # 如果栈为空跳出while循环,将数值入栈
break
left = st[-1] # 将栈顶的下一个数值(举例为图中数字5)赋值给left指针
dh = min(height[left], h) - bottom_h # 面积的高 (举例取图中数字5和4最小的那位,再减去栈顶数值2)
ans += dh * (i - left - 1) # 上面得到的高乘水柱宽度(当前index减去left指针再减1(宽度)得到水柱宽度)
st.append(i) # 将数值加入栈里(关于单调递增栈我们要知道,如果要加入的数值比栈顶数值大,需要将栈顶数值弹出后再执行入栈)
return ans

以上代码与图片均来自灵茶山艾府,我在代码上加了注释和图片上指出代码中的变量,发笔记时为了Mark一下现在的理解
1832

被折叠的 条评论
为什么被折叠?



