news 2026/7/29 3:08:23

LeetCode 第42题 接雨水

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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,无需额外判断。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/29 3:06:35

Android Fastboot命令全解析:从原理到实战,解锁设备底层控制权

1. 项目概述&#xff1a;为什么你需要掌握Fastboot命令&#xff1f; 如果你是一名Android开发者、ROM爱好者&#xff0c;或者仅仅是喜欢折腾自己手机的用户&#xff0c;那么“Fastboot”这个词对你来说一定不陌生。它就像一把打开Android设备底层大门的钥匙&#xff0c;是连接…

作者头像 李华
网站建设 2026/7/29 3:04:53

从按键消抖到状态机:嵌入式GPIO输入与事件驱动设计实战

1. 项目缘起&#xff1a;从“点灯”到“状态机”的思维跃迁在嵌入式系统学习的道路上&#xff0c;几乎所有人的第一个实验都是“点灯”。这就像学编程的“Hello World”&#xff0c;看似简单&#xff0c;却是一切复杂交互的基石。我当年做课设时&#xff0c;老师布置的题目就是…

作者头像 李华
网站建设 2026/7/29 3:04:47

全球拼图式停车系统市场发展模式及前景战略分析报告2026年版

全球拼图式停车系统市场发展模式及前景战略分析报告2026年版拼图式停车系统是一类通过多层车位模块在水平与垂直方向协同移动&#xff0c;实现车辆存取的机械式停车设备&#xff0c;其运行方式类似“拼图重排”&#xff0c;通过腾挪空位来完成目标车辆的调度。该系统通常由钢结…

作者头像 李华
网站建设 2026/7/29 3:02:57

GraphRAG 和 LightRAG 详解:原理、对比与选型

传统 RAG 擅长寻找相似段落&#xff0c;但面对跨文档关系、复杂事件链和全库主题总结时&#xff0c;经常出现“每一段都找到了&#xff0c;却没有把它们连起来”的问题。GraphRAG 与 LightRAG 都试图解决这个缺口&#xff0c;但两者并不是同一个方案的轻重版本。 图 1&#xff…

作者头像 李华
网站建设 2026/7/29 3:00:29

Java集合框架:ArrayList创建方式全解析与性能优化实践

1. 从“new ArrayList<>()”说起&#xff1a;为什么它是最常用的起点每次打开IDE准备写点Java代码&#xff0c;只要涉及到集合操作&#xff0c;我的手指几乎会不假思索地敲出new ArrayList<>()。这就像一种肌肉记忆&#xff0c;简单、直接、有效。但你是否想过&…

作者头像 李华
网站建设 2026/7/29 2:58:43

黑客圈都在聊什么,带你盘点全球十大知名安全社区

很多刚接触网络安全的朋友&#xff0c;往往对“黑客圈”充满了好奇&#xff1a;他们平时在哪里交流&#xff1f;那些听起来很厉害的漏洞利用技术是从哪来的&#xff1f;是不是所有黑客论坛都是法外之地&#xff1f;其实&#xff0c;全球的网络安全社区生态非常复杂&#xff0c;…

作者头像 李华