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

JAVA练习270-接雨水

题目概览

给定n个非负整数表示每个宽度为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 * 104
  • 0 <= height[i] <= 105

来源:42. 接雨水 - 力扣(LeetCode)

解题分析

方法一:动态规划

按照每个格子的角度看,每个格子能达到的蓄水池深度取决于左右两边最高的格子,令左边最高为 leftMax[ i ],右边最高为 rightMax[ i ],当个格子蓄水深度为 dp[i],可得:
dp[ i ] = min{ leftMax[ i ], rightMax[ i ] } - height[ i ]
先遍历获取左右两边最大高度,然后计算每个格子蓄水深度即可。

时间复杂度:O(n)
空间复杂度:O(n)

class Solution { public int trap(int[] height) { int result = 0, len = height.length; int[] leftMax = new int[len+1], rightMax = new int[len+1]; leftMax[0] = height[0]; rightMax[len-1] = height[len-1]; for (int i = 1; i < len; ++i) { leftMax[i] = Math.max(height[i], leftMax[i-1]); rightMax[len - 1 - i] = Math.max(height[len - 1 - i], rightMax[len - i]); } for (int i = 1; i < len; ++i) { result += Math.min(leftMax[i], rightMax[i]) - height[i]; } return result; } }

方法二:动态规划 + 双指针

由方法一得知,左边最高是从左往右遍历,右边最高是从右往左遍历,因此我们可以尝试使用双指针节省空间,令 i 在格子最左侧,j 在格子最右侧,如果 height[i] < height[j],则 leftMax 一定也 < rightMax,因此可以得出:
当 height[i] <= height[j] 时,dp[i] = leftMax - height[i];
当 height[i] > height[j] 时,dp[i] = rightMax - height[i]。

时间复杂度:O(n)
空间复杂度:O(1)

class Solution { public int trap(int[] height) { int result = 0, i = 0, j = height.length - 1, leftMax = 0, rightMax = 0; while(i < j) { leftMax = Math.max(height[i], leftMax); rightMax = Math.max(height[j], rightMax); if (height[i] < height[j]) { result += leftMax - height[i]; i++; }else { result += rightMax - height[j]; j--; } } return result; } }
http://www.jsqmd.com/news/1067421/

相关文章:

  • Privado:开源数据流检测架构深度解析与合规性优化实践
  • 数字孪生管网末端执行单元:智能照明如何成为平台指令的最后一里
  • 喜讯!泰克尼康参编《宇航级民用食品安全要求》团体标准正式发布实施!
  • 超越参数迷思:AI时代的“数字镜像”与人类思想建设
  • Buzz:终极隐私保护的本地音频转录工具,完全离线运行![特殊字符]️
  • 如何用SiYuan开源知识管理软件重构你的思考方式:完整使用指南
  • 柔性负荷调控:可中断负荷与需求响应技术
  • 解锁Windows远程桌面多用户连接的终极解决方案:RDP Wrapper配置详解
  • 防晒工作服衬衫
  • TDengine 时序数据库实战笔记(20260622)
  • 已抓取未编入索引处理 GSC:AI写的文章被嫌弃?3招二次优化教你抢救
  • 第03章|分而治之:Sub-Agents 的核心概念与应用价值
  • ⑨番外篇II,FastLLM——老卡也能跑满血DeepSeek
  • AI+产业落地:从试点尝鲜到价值闭环的六大场景
  • 南宁儿童涂氟亲测2026年6月分享
  • 2048游戏模拟
  • 安全组网热门品牌推荐
  • .splat文件是什么?如何优化.splat文件实现流畅加载?
  • 法奥钟表零件自动组装,微米级精密对位,保障走时准确性
  • 中小运营商 5G 核心网建设方案
  • 收藏!AI大模型前端进阶指南:从效率提升到产品落地
  • LineX荣登欧洲权威机器视觉期刊《inspect》
  • 从连接到能源:解密DePIN如何通过密码学验证“真实工作”
  • 【优化求解】基于遗传算法和粒子群算法求解清华校园雨水排水管网定线优化问题附Matlab代码和报告
  • Linux安装vcpkg
  • 高考后大学4年花10万,室内设计培训1个月花几千——算完这笔账我沉默了
  • 从Prompt到Context再到Harness:AI Agent的进化与未来趋势
  • VulnHub 靶机实战:Infosec_Warrior1 从信息收集到 Root 提权全流程
  • Spring Boot + XXL-Job 实现考勤自动补账:缺卡生成、历史回算和幂等设计
  • 从“归档凭证“到“数据资产“——合同智能应用实战思考