news 2026/6/12 5:35:13

代码随想录 42.接雨水

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
代码随想录 42.接雨水

思路:接雨水在面试中很常见,有三种解法。分别是暴力解法、双指针优化和单调栈。

一、暴力解法:暴力解法也是使用双指针(超时)。

1.明确按照行来算还是列来算。

(1)按照行来算:

(2)按照列来算:

2.以按照列来算为例(因为按照列来算更容易理解)。

(1)如果按照列来算,宽度一定为1,再把每一列雨水的高度求出来即可。

(2)每一列雨水的高度,取决于该列左侧最高的柱子和右侧的最高的柱子中最矮的那个柱子的高度。以求列4的雨水高度为例,如下图所示。

——列4的左侧最高的柱子为列3,高度为2(以下用lHeight表示)。

——列4的右侧最高的柱子为列7,高度为3(以下用rHeight表示)。

——列4柱子的高度为1(以下用height表示)。

——那么列4的雨水高度为:列3和列7的高度最小值,再减去列4的高度,即min(lHeight,rHeight) - height。

——列4的雨水高度求出来了,宽度为1,相乘就是列4的雨水体积了。

(3)只要从头遍历一遍所有的列,然后求出每一列雨水的体积,相加之后就是总雨水的体积了(注意第一个柱子和最后一个柱子不接雨水)。

附代码:

class Solution { public int trap(int[] height) { int sum = 0; for(int i = 0;i < height.length;i++){ //第一个柱子和最后一个柱子不接雨水 if(i == 0 || i == height.length - 1){ continue; } int lHeight = height[i]; //记录左边柱子的最高高度 int rHeight = height[i]; //记录右边柱子的最高高度 for(int l = i - 1;l >= 0;l--){ if(height[l] > lHeight){ lHeight = height[l]; } } for(int r = i + 1;r < height.length;r++){ if(height[r] > rHeight){ rHeight = height[r]; } } int h = Math.min(lHeight,rHeight) - height[i]; if(h > 0){ sum += h; } } return sum; } }

二、双指针优化。

1.在暴力解法中,是有重复计算的,这是因为为了得到两边的最高高度,使用了双指针来遍历,每到一个柱子都向两边遍历一遍。

2.优化:把每一个位置的左边最高高度记录在一个数组上(maxLeft),右边最高高度记录在一个数组上(maxRight),以避免重复计算。

3.思路:在当前位置,左边的最高高度是前一个位置的左边的最高高度和本高度的最大值;右边的最高高度也同理。

(1)从左向右遍历:maxLeft[i] = max(height[i],maxLeft[i - 1])。

(2)从右向左遍历:maxRight[i] = max(height[i],maxRight[i + 1])。

附代码:

(一)双指针:

class Solution { public int trap(int[] height) { int len = height.length; if(len <= 2){ return 0; } int[] maxLeft = new int[len]; int[] maxRight = new int[len]; //记录每个柱子左边柱子的最大高度 maxLeft[0] = height[0]; for(int i = 1;i < len;i++){ maxLeft[i] = Math.max(height[i],maxLeft[i - 1]); } //记录每个柱子右边柱子的最大高度 maxRight[len - 1] = height[len - 1]; for(int i = len - 2;i >= 0;i--){ maxRight[i] = Math.max(height[i],maxRight[i + 1]); } //求和 int sum = 0; for(int i = 0;i < len;i++){ int count = Math.min(maxLeft[i],maxRight[i]) - height[i]; if(count > 0){ sum += count; } } return sum; } }

(二)双指针优化版。

class Solution { public int trap(int[] height) { if(height.length <= 2){ return 0; } //从两边向中间寻找最值 int maxLeft = height[0],maxRight = height[height.length - 1]; int l = 1,r = height.length - 2; int res = 0; while(l <= r){ //不确定上一轮是左边移动还是右边移
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 5:34:49

别再傻傻分不清了!C语言中算术移位、逻辑移位和循环移位的区别与实战避坑指南

彻底搞懂C语言中的移位操作&#xff1a;算术、逻辑与循环移位的深度解析与实战指南在嵌入式开发、数据加密和性能优化等场景中&#xff0c;位操作是最接近硬件的编程技巧之一。许多开发者在处理有符号数、网络字节序或位掩码时&#xff0c;常常因为混淆不同类型的移位操作而引入…

作者头像 李华
网站建设 2026/6/12 5:32:59

系分_案例_系统架构、中间件、微服务与消息队列

分层架构通过将系统划分为表示层、业务层、数据访问层和数据层&#xff0c;实现职责分离和降低耦合。SOA强调以服务为中心&#xff0c;通过标准接口实现系统集成和服务复用。微服务将系统拆分为一组围绕业务能力构建的小服务&#xff0c;每个服务可以独立开发、测试、部署、扩展…

作者头像 李华
网站建设 2026/6/12 5:30:52

LangGraph图模型实战:构建可调试、可扩展的AI智能体

1. 项目概述&#xff1a;这不是在搭积木&#xff0c;而是在设计AI的神经系统“&#x1f680; Mastering Agentic Design Patterns with LangGraph: A Complete Guide to Building Intelligent AI Systems”——这个标题里藏着一个正在快速成型的技术分水岭。我从2022年底开始密…

作者头像 李华
网站建设 2026/6/12 5:27:51

AI真实用户行为报告:从搜索替代到工作流嵌入的四阶跃迁

1. 项目概述&#xff1a;这不是技术白皮书&#xff0c;而是一份真实用户行为切片报告“Inside ChatGPT: How 700 Million People Actually Use AI”——这个标题里藏着三个被绝大多数技术分析忽略的关键事实&#xff1a;700百万不是注册数&#xff0c;是月活&#xff1b;“Actu…

作者头像 李华
网站建设 2026/6/12 5:26:52

保姆级图解:PCIe 4.0链路训练状态机从Detect到L0的完整流程与超时处理

PCIe 4.0链路训练状态机全流程解析与实战排错指南当一块PCIe 4.0 SSD或显卡在服务器主板上无法被识别时&#xff0c;硬件工程师的调试工作往往从链路训练状态机开始。这个看似简单的状态跳转过程&#xff0c;实际上包含了数十个关键条件和超时机制&#xff0c;任何一个环节出错…

作者头像 李华