题目描述
柱子的宽度是1,高度存在数组中,问如果按照此排列,下雨后能接多少雨水
f1-单调栈 |
基本分析
- 要计算能存雨量,需要左边界的高度>=当前标高,需要用什么结构来维护?结构是单调的
- 又由于可能当前标高是逐渐递增考虑的,不是只计算一次,结构需要从右边添加或者右边弹出?栈
- 用单调栈怎么模拟计算的过程?(1)追加元素的情况:栈是空或者栈追加i处的索引后,依然满足单调递减,就一直追加;(2)计算答案的情况:否则就要把栈顶的top弹出来,计算以st[-1]为左边界,h[top]为底,i为右边界的区间的面积;计算完以后如果还是满足while的条件,就继续弹出重复操作;(3)为什么栈空的时候有个break?此刻没有左边界了,肯定不用再考虑
代码
class Solution:
def trap(self, height: List[int]) -> int:
ans = 0
st = []
for i, h in enumerate(height):
while st and height[st[-1]] < h:
cur = st.pop()
if not st:
break
left = st[-1]
w = i - left - 1
d = min(height[left], h) - height[cur]
ans += w * d
st.append(i)
return ans
总结
- 栈内存的是索引,索引对应的值是单调递减的(非严格,可以=)
- 弹出和插入的操作都是在右边完成的
其他方法:待补充
标签:边界,42,雨水,height,ans,st,单调,left From: https://www.cnblogs.com/zk-icewall/p/17229584.html