【力扣高频题】042.接雨水问题

上一篇我们通过采用 双指针 的方法解决了 经典 容器盛水 问题 ,本文我们接着来学习一道在面试中极大概率会被考到的经典题目:接雨水 问题 。

42. 接雨水

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

示例 1:

输入: height = [0,1,0,2,1,0,1,3,2,1,2,1]

输出: 6

解释: 在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。

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

思路分析

边界条件: 如果只有 一个 或 两个 柱子,一定是接不到水的。

我们考虑每个柱子的接水情况,当前列能够接多少水,取决于 当前列的高度 以及 左右两侧的最大高度

与 上一道题 思想类似:能够装多少水量,取决于两端 较短 的竖线的 长度

因此,大致思路就浮现出来了:

对于下标 i 位置的柱子来说,只需计算出左右两侧最大高度的 最小值(即能够达到的最大高度),与当前列的高度 作差 ,即可知道当前列的接水量。

遍历整个数组,将每个位置的接水量进行累加,即可得到最终的接水量。

注意:

  1. 若当前列的高度大于等于左右两侧最大高度的最小值时,接水量为 0 (要避免负值的出现)
  2. 左右两侧边界处 不会有接水量 ,因此从第二个柱子遍历到倒数第二个柱子即可。

暴力代码

public int trap(int[] height) {int water = 0;// 左右两侧边界不考虑for (int i = 1; i < height.length - 1; i++) {int leftMax = 0;// 找出左侧的最大值for (int j = i - 1; j >= 0; j--) {if (height[j] > leftMax) {leftMax = height[j];}}int rightMax = 0;// 找出右侧的最大值for (int j = i + 1; j < height.length; j++) {if (height[j] > rightMax) {rightMax = height[j];}}// 左右两侧最大高度的 最小值int min = Math.min(leftMax, rightMax);// 当大于当前列的高度时才有接水量if (min > height[i]) {water += min - height[i];}}return water;
}

暴力法分析

在该方法中,对于每个数组元素的求解,都需要 O ( n ) O(n) O(n) 的时间复杂度向左右两端遍历整个数组,得到最大值。因此总的时间复杂度为 O ( n 2 ) O(n^2) O(n2) 。空间复杂度为 O ( 1 ) O(1) O(1)

思路优化

接下来我们仍采取 双指针的思想 进行优化。

由于当前位置的接水量取决于左右两侧最大值的较小值。因此,可以设置左右指针进行更新。

  1. 设置 LR 双指针记录当前要计算的是 哪个位置 的接水量。

  2. 设置两个最大值的变量 leftMaxrightMax ,用来记录处于当前位置时,左右两侧的 最大值

最大值哪侧更小,就说明此时可以计算出哪侧的接水量了,并记得更新该侧的最值(看此时的高度是否超过了之前的最值高度),之后往下移动。

直至两个指针相遇后,计算出了总的接水量。

优化代码

public static int trap(int[] arr) {if (arr == null || arr.length < 3) {return 0;}int N = arr.length;int L = 1;int leftMax = arr[0];int R = N - 2;int rightMax = arr[N - 1];int water = 0;while (L <= R) {if (leftMax <= rightMax) {water += Math.max(0, leftMax - arr[L]);leftMax = Math.max(leftMax, arr[L++]);} else {water += Math.max(0, rightMax - arr[R]);rightMax = Math.max(rightMax, arr[R--]);}}return water;
}

复杂度分析

左右两个指针的移动次数不超过数组的长度,因此时间复杂度为 O ( n ) O(n) O(n) 。空间复杂度为 O ( 1 ) O(1) O(1)


这道题目主要考察了使用 双指针 优化频繁遍历的思想,是算法题中经常出现的考察形式。小伙伴们一定要牢牢掌握哦~

~ 点赞 ~ 关注 ~ 星标 ~ 不迷路 ~!!!

回复「ACM紫书」获取 ACM 算法书籍 ~
回复「算法导论」获取 算法导论第3版 ~

在看 + 转发

让你的小伙伴们一起来学算法吧!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/868974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java-Redis-Clickhouse-Jenkins-MybatisPlus-Zookeeper-vscode-Docker-jdbc

文章目录 Clickhouse基础实操windows docker desktop 下载clickhousespringboot项目配置clickhouse Redis谈下你对Redis的了解&#xff1f;Redis一般都有哪些使用的场景&#xff1f;Redis有哪些常见的功能&#xff1f;Redis支持的数据类型有哪些&#xff1f;Redis为什么这么快…

第一个ffmpeg程序

在进行使用ffmpeg进行编写程序时&#xff0c;首先要记得进行注册设备&#xff08;avdevice_register_all &#xff09;&#xff0c;程序运行时&#xff0c;只需要注册一次就可以 avdevice_register_all 是 FFmpeg 多媒体处理库中的一个函数&#xff0c;其作用是注册所有可用的音…

【AI前沿】人工智能的历史演进

文章目录 &#x1f4d1;引言一、人工智能的起源与早期发展1.1 古代与早期的智能机器设想1.2 20世纪初期的机械计算机1.3 图灵测试与计算智能1.4 达特茅斯会议与人工智能的正式诞生 二、早期AI研究与第一次冬天2.1 早期的探索与挑战2.2 早期的专家系统2.3 第一次AI冬天 三、专家…

SpringBoot日常:@Scheduled实现服务启动时执行一次

文章目录 一、Scheduled详解二、逻辑实现1、创建定时任务逻辑方法2、新建一个启动执行类 三、测试结果 说到定时任务&#xff0c;我们应该会想起Scheduled&#xff0c;Quartz以及XXL-JOB&#xff0c;但是有的单体服务或者小项目&#xff0c;为了方便快捷&#xff0c;可能会直接…

【昇思25天学习打卡营第1天】

前言 例如&#xff1a;随着大模型的爆火&#xff0c;这门技术也越来越重要&#xff0c;很多人都开启了关于大模型知识的学习&#xff0c;但大模型需要一定的资源且涉及的模块很多&#xff0c;如果个人想要系统的学习会有些难度&#xff0c;好在有昇思大模型平台&#xff0c;能…

WebRTC群发消息API接口选型指南!怎么用?

WebRTC群发消息API接口安全性如何&#xff1f;API接口怎么优化&#xff1f; WebRTC技术在现代实时通信中占据了重要地位。对于需要实现群发消息功能的应用程序来说&#xff0c;选择合适的WebRTC群发消息API接口是至关重要的。AokSend将详细介绍WebRTC群发消息API接口的选型指南…

本地部署 SenseVoice - 阿里开源语音大模型

本地部署 SenseVoice - 阿里开源语音大模型 1. 创建虚拟环境2. 克隆代码3. 安装依赖模块4. 启动 WebUI5. 访问 WebUI 1. 创建虚拟环境 conda create -n sensevoice python3.11 -y conda activate sensevoice 2. 克隆代码 git clone https://github.com/FunAudioLLM/SenseVoic…

本地部署 Llama3 – 8B/70B 大模型!

Llama3&#xff0c;作为Meta公司新发布的大型语言模型&#xff0c;在人工智能领域引起了广泛的关注。特别是其8B&#xff08;80亿参数&#xff09;版本&#xff0c;在性能上已经超越了GPT-3.5&#xff0c;而且由于是开源的&#xff0c;用户可以在自己的电脑上进行部署。 本文和…

太多项会毁了回归

「AI秘籍」系列课程&#xff1a; 人工智能应用数学基础 人工智能Python基础 人工智能基础核心知识 人工智能BI核心知识 人工智能CV核心知识 多项式回归的过度拟合及其避免方法 通过添加现有特征的幂&#xff0c;多项式回归可以帮助你充分利用数据集。它允许我们甚至使用简…

【智能算法改进】多策略改进的蜣螂优化算法

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】蜣螂优化算法&#xff08;DBO&#xff09;原理及实现 2.改进点 混沌反向学习初始化 采用 Pwlcm 分段混沌映射&#xff0c;由于 Pwlcm 在其定义区间上具有均匀的密度函数&#xff0c;在特定的…

User parameters 用户参数与Web监控

目录 一. 自定义键介绍 二. 制作步骤 1. 添加无可变部分参数 2. 添加有可变参数 3. 使用用户参数监控php-fpm 服务的状态 三. Web页面导入应用监控 四. Web监控 主要功能和操作&#xff1a; 开启方式 官方预定义监控项文档https://www.zabbix.com/documentation/6…

华三m-lag三层转发+VRRP配置案例

目录 一、相关理论介绍 1.1 华三M-LAG介绍 1.2 DRCP协议 1.3 keepalive机制 1.4 MAD机制 1.5 一致性检查功能 二、M-LAG系统建立及工作过程 三、实验组网案例 3.1 组网需求 3.2 组网拓扑 3.3 设备接口及地址规划 四、具体配置命令 4.1 S6850-1的配置 4.2 S6850-2…

AI:助力开发者翱翔,而非抢夺其舞台

在当今这个科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;犹如一股春风&#xff0c;悄然渗透进全球各个行业&#xff0c;尤其在软件开发领域&#xff0c;其影响力日益显著。从初创企业到跨国巨头&#xff0c;无一不在积极探索AI如何重塑编程的面貌&#xf…

护眼灯什么价位的好?好用又实惠的护眼灯推荐

护眼灯&#xff0c;简单来说就是保护视力的台灯&#xff0c;专业的护眼台灯的光线与自然光光线相似&#xff0c;有亮度稳定、不闪烁&#xff0c;发光面积大等这些特点。那么&#xff0c;护眼灯什么价位的好&#xff1f;市面上所出现的护眼台灯良莠不齐&#xff0c;价格低的质量…

【源码+文档+调试讲解】文物管理系统

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

warning: LF will be replaced by CRLF the next time Git touches it warning

问题&#xff1a; warning: in the working copy of , LF will be replaced by CRLF the next time Git touches it warning: 今天上传git时报错&#xff0c;使用Ai&#xff1b;得知&#xff1b; 解决&#xff1a; 将 Git 配置为不自动转换换行符&#xff0c;使用以下命令…

一.5 高速缓存至关重要

这个简单的示例揭示了一个重要的问题&#xff0c;即系统花费了大量的时间把信息从一个地方挪到另一个地方。hello程序的机器指令最初是存放在硬盘上&#xff0c;当程序加载时&#xff0c;它们被复制到主存&#xff1b;当处理器运行程序时&#xff0c;指令又从主存复制到处理器。…

触摸屏虚拟键盘组件 jQuery Virtual Keyboard使用 自定义键盘

如何在触摸设备上为输入域添加虚拟键盘&#xff1f; 一个插件可以解决这个问题&#xff0c;关键还支持高度自定义&#xff08;git地址&#xff09;&#xff1a; GitHub - Mottie/Keyboard: Virtual Keyboard using jQuery ~ 官网地址&#xff1a;Virtual Keyboard 使用步骤&…

NISP证书备考指南与经验分享

在信息安全领域&#xff0c;NISP(国家信息安全水平考试)作为衡量专业能力的重要标尺&#xff0c;不仅是职场晋升的敲门砖&#xff0c;更是个人技能提升的关键一步。面对这一挑战&#xff0c;如何高效备考&#xff0c;成为众多学员关注的焦点。今天&#xff0c;为您精心打造这份…

原生APP开发的优势

原生APP开发是指使用特定的编程语言和开发工具&#xff0c;针对特定的操作系统平台进行开发的应用程序。相比于混合开发和Web开发&#xff0c;原生APP开发具有以下优势。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1. 性能更优 原…