42. 接雨水

题目描述

柱子的宽度是1,高度存在数组中,问如果按照此排列,下雨后能接多少雨水

f1-单调栈

基本分析

  1. 要计算能存雨量,需要左边界的高度>=当前标高,需要用什么结构来维护?结构是单调的
  2. 又由于可能当前标高是逐渐递增考虑的,不是只计算一次,结构需要从右边添加或者右边弹出?栈
  3. 用单调栈怎么模拟计算的过程?(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

总结

  1. 栈内存的是索引,索引对应的值是单调递减的(非严格,可以=)
  2. 弹出和插入的操作都是在右边完成的

其他方法:待补充

posted @   zhangk1988  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示