当前位置: 首页 > news >正文

LeetCode 第42题 接雨水

class Solution { public int trap(int[] height) { int ans = 0; // 保存总共承接雨水总量 int left = 0, right = height.length - 1; // 左右双指针 int leftMax = 0, rightMax = 0; // left左侧最高柱子、right右侧最高柱子 while(left < right) { // 更新左边最大高度 leftMax = Math.max(leftMax, height[left]); // 更新右边最大高度 rightMax = Math.max(rightMax, height[right]); if(height[left] < height[right]) { // 左边柱子更低:当前位置存水量 = 左侧最高高度 - 当前柱子高度 ans += leftMax - height[left]; left++; } else { // 右边柱子更低:当前位置存水量 = 右侧最高高度 - 当前柱子高度 ans += rightMax - height[right]; right--; } } return ans; } }

一、核心算法思想(双指针 O (n)、空间 O (1))

基础理论:单个位置蓄水量 = min (当前位置左侧最高柱子,当前位置右侧最高柱子) − 当前柱子高度

  1. 定义左指针left起始于数组头部,右指针right起始于数组尾部;
  2. leftMax:记录左指针遍历路径上的最高柱子;rightMax:记录右指针遍历路径上的最高柱子;
  3. 短板判定规则:
    • 如果height[left] < height[right]:左侧为短板。此时leftMax就是左右两侧较小的最大值,直接计算当前 left 位置雨水,左指针右移;
    • 如果height[left] >= height[right]:右侧为短板。此时rightMax就是左右两侧较小的最大值,直接计算当前 right 位置雨水,右指针左移;
  4. 累加每个位置蓄水量,指针相遇循环结束,返回雨水总和。

记忆口诀:哪边柱子矮,先算哪边蓄水量,移动哪边指针。

二、实例运行表格推演

测试样例:height = [0,1,0,2,1,0,1,3,2,1,2,1]
初始状态:left=0,right=11,leftMax=0,rightMax=0,ans=0

leftrightheight[left]height[right]leftMaxrightMax大小对比当前格子雨水总水量 ans
0110101left 矮0-0=00
1111111相等,走右侧逻辑1-1=00
1101212left 矮1-1=00
2100212left 矮1-0=11
3102222相等,走右侧逻辑2-2=01
392122right 矮2-1=12
382222相等,走右侧逻辑2-2=02
372323left 矮2-2=02
471323left 矮2-1=13
570323left 矮2-0=25
671323left 矮2-1=16

循环终止条件:left=7,right=7,不满足left<right,最终总雨水ans=6

三、易错点与知识点总结

1. 容易混淆题目区分

LeetCode 11【盛最多水的容器】 VS LeetCode 42【接雨水】

  • 11 题:求两根柱子之间形成的矩形面积,整体区间蓄水;
  • 42 题:逐根竖柱单独计算垂直方向雨水,每个位置受左右最高柱子限制,两道题模型完全不同,不要混用思路。

2. 核心概念误区

leftMaxrightMax不是全局最大值,只是指针行进路径上记录的最大值。依靠「短板效应」,不需要预先开辟数组存储每个位置左右最大值,实现 O (1) 空间复杂度。

3. 蓄水量不会为负数

leftMax永远大于等于height[left]rightMax永远大于等于height[right],因此计算出的雨水数值≥0,无需额外判断。

http://www.cnnetsun.cn/news/3720528.html

相关文章:

  • Android Fastboot命令全解析:从原理到实战,解锁设备底层控制权
  • 从按键消抖到状态机:嵌入式GPIO输入与事件驱动设计实战
  • 全球拼图式停车系统市场发展模式及前景战略分析报告2026年版
  • GraphRAG 和 LightRAG 详解:原理、对比与选型
  • Java集合框架:ArrayList创建方式全解析与性能优化实践
  • 黑客圈都在聊什么,带你盘点全球十大知名安全社区
  • 【AI媒体内容生产终极指南】:20年实战总结的7大避坑法则与3步提效公式
  • 从零搭建AI Agent:基于LangChain与RAG的工程实践指南
  • 技术提问九大准则:从无效沟通到高效协作的实践指南
  • 计算机毕业设计之基于SpringBoot的地铁站点查询系统
  • 20260728 交付文档定稿与音频子系统理解
  • 导电墨水笔电路制作:从原理到实践,手绘电子原型全解析
  • LLM工具实战指南:从环境适配到批量任务部署
  • AI Agent开发实战:从基础对话到企业级多步骤任务规划
  • Keras深度学习训练范式:构建模型 (Build)→ 配置训练规则 (Compile)→ 执行训练(Fit) + 回调控制(Callback)
  • 植物冠层参数解析:从LAI到FAPAR,量化植被生产力的关键技术
  • Python os模块深度解析:从文件操作到系统交互的实战指南
  • 5分钟免费获取11款米哈游游戏字体:HoYo-Glyphs完整使用指南
  • 从零手写一个 ReAct Agent:让大模型自己调用工具
  • 华为MetaERP Oracle EBS 离散制造:工单、BOM、车间领料、完工入库、五大成本要素、成本中心核算,从设计哲学 → 核心模型 → 五大成本要素 → 业务流程 → 成本中心归集逻辑 → 会
  • 60、80、90、120法兰伺服电机如何匹配行星减速机框号?附计算与接口核对方法
  • 企业级AI Token配额管理:从成本管控到规模化应用实战
  • 麻雀优化算法在PID控制参数整定中的应用实践
  • 基于热释电红外传感器与Arduino的智能安防报警系统DIY全攻略
  • 从DeepSeek融资暂停看技术公司信息安全与风险管理
  • RAG处理Word与PDF文档:解析、抽取与切片的关键技术
  • CaP-X框架:机器人编码智体评估与工业应用实践
  • AI论文写作助手:提升学术效率的NLP与知识图谱技术
  • [特殊字符] “YOLO 模式” 首次曝光:AI 代理自主渗透泰国财政部,网络间谍进入全自动化时代
  • Windows开发者必备:Git Bash安装与SSH密钥配置全攻略