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

[Java恶补day7] 42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例 1:
测试样例1高度图输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]
输出:6
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。

示例 2:
输入:height = [4,2,0,3,2,5]
输出:9

提示:
n == height.length
1 <= n <= 2 ∗ 10 4 2 * 10^4 2104
0 <= height[i] <= 10 5 10^5 105


知识点:
数组、双指针


解:
首先,这是一题双指针的题目(当然也有其他方法:dp、单调栈)。根据双指针的常用方法,设置两个指针pipj分别指向数组的两端,并且左指针向右移动,右指针向左移动

观察图示,所接雨水的量,取决于当前遍历的这个元素左右两侧的更小的那个高度,因此用两个变量lMaxrMax分别存储左边的最大值、右边的最大值。当左/右指针指向一个新的元素时,要判断当前元素的高度是否比对应的lMax/rMax大,若是,则取当前元素的高度,否则保留lMaxrMax的值。因此得到:

lMax = Math.max(height[pi], lMax);
rMax = Math.max(height[pj], rMax);

这里,只要左侧最大高度lMax比右侧最大高度rMax大,就处理左边;否则,处理右边(实际上这是考虑最高的柱子在数组的中间,而不是两侧)。
当处理左侧/右侧时:
①首先,计算当前遍历的元素所对应的面积,公式为(max-height[p])*1,其中,max对应lMaxrMax,p对应pipj。这里面积×1是因为题目指明了每个柱子的宽度为1。
②然后,加计算出来的面积加入结果变量sum中。

最后,只要不满足左指针<右指针,就退出循环,并返回最终的变量sum。

对于测试样例1,有以下分析过程:
测试样例1分析过程
对于测试样例2,有以下分析过程:
测试样例2分析过程
时间复杂度: O ( n ) O(n) O(n),最多遍历一次整个数组的所有元素
空间复杂度: O ( 1 ) O(1) O(1)

class Solution {public int trap(int[] height) {int sum = 0;int n = height.length;//定义双指针int pi = 0;int pj = n - 1;//定义变量存储左右最大的heightint lMax = 0;int rMax = 0;//只要左指针<右指针,就继续循环while (pi < pj) {//获取当前遍历的lMax、rMax,是当前遍历的高度与变量的值的更大的那个lMax = Math.max(height[pi], lMax);rMax = Math.max(height[pj], rMax);//对于两个max中更小的数,用对应的指针(lMax更小,当前用pi;rMax更小,当前用pj)if (lMax < rMax) {//计算当前凹槽所接雨水量int cur = (lMax - height[pi]) * 1;sum += cur;//更新左指针(向右移动)pi++;} else {//计算当前凹槽所接雨水量int cur = (rMax - height[pj]) * 1;sum += cur;//更新右指针(向左移动)pj--;}}return sum;}
}
http://www.xdnf.cn/news/650359.html

相关文章:

  • 聊天室H5实时群聊聊天室全开源系统(源码下载)
  • 篇章三 基础——不可变类
  • 工信部中文点选验证码识别
  • Engineering a direct k-way Hypergraph Partitioning Algorithm【2017 ALENEX】
  • 基于JWT+Redis的登录流程实现
  • 分布式ID
  • 解决虚拟机挂起后,docker容器无法访问的问题
  • Qt6无法识别OpenCV(Windows端开发)
  • 【RabbitMQ】基于Spring Boot + RabbitMQ 完成应用通信
  • 七、【前端路由篇】掌控全局:Vue Router 实现页面导航、动态路由与权限控制
  • 2025/5/26 学习日记 基本/扩展正则表达式 linux三剑客之grep
  • [ARM][架构] 02.AArch32 程序状态
  • 3DVR拍摄指南:从理论到实践
  • [特殊字符] next-intl 服务端 i18n getTranslations 教程
  • 三分钟了解 MCP 概念(Model Context Protocol,模型上下文协议)
  • CLAM完整流程。patches-feature-split-train-eval
  • 5.26 面经整理 360共有云 golang
  • Java大师成长计划之第31天:Docker与Java应用容器化
  • 基于matlab版本的三维直流电法反演算法
  • 论文阅读: 2023 NeurIPS Jailbroken: How does llm safety training fail?
  • 支持selenium的chrome driver更新到136.0.7103.113
  • C++寻位映射的究极密码:哈希扩展
  • ubuntu 22.04 配置静态IP、网关、DNS
  • 鸿蒙OSUniApp 实现的日期选择器与时间选择器组件#三方框架 #Uniapp
  • 对数的运算困惑
  • 鸿蒙OSUniApp 开发带有通知提示的功能组件#三方框架 #Uniapp
  • Linux《基础IO》
  • 深入Java TCP流套接字编程:高效服务器构建与高并发实战优化指南​
  • Kafka自定义分区策略实战避坑指南
  • 论文阅读笔记:YOLO-World: Real-Time Open-Vocabulary Object Detection