42. 接雨水
题目描述
柱子的宽度是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
总结
- 栈内存的是索引,索引对应的值是单调递减的(非严格,可以=)
- 弹出和插入的操作都是在右边完成的
其他方法:待补充
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现