【LeetCode】42.接雨水

接雨水

题目描述:

        给定 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

思路分析:

作为力扣的经典hard题和面经的常考题,本题的的解法也是非常多样。下面列举几种常见解法:

解法一:按行求

        整个思路就是,求第 i 层的水,遍历每个位置,如果当前的高度小于 i,并且两边有高度大于等于 i 的,说明这个地方一定有水,水就可以加 111。

        如果求高度为 i 的水,首先用一个变量 temp 保存当前累积的水,初始化为 000。从左到右遍历墙的高度,遇到高度大于等于 i 的时候,开始更新 temp。更新原则是遇到高度小于 i 的就把 temp 加 111,遇到高度大于等于 i 的,就把 temp 加到最终的答案 ans 里,并且 temp 置零,然后继续循环。

image.png

        但这个解法现在 AC 不了了,会报超时,也就不展示代码了

解法二:按列求

        求每一列的水,我们只需要关注当前列,以及左边最高的墙,右边最高的墙就够了。至于装水的多少,当然根据木桶效应,我们只需要看左边最高的墙和右边最高的墙中较矮的一个就够了。

所以,根据较矮的那个墙和当前列的墙的高度可以分为两种情况。

  • 较矮的墙的高度大于当前列的墙的高度
  • 较矮的墙的高度小于等于当前列的墙的高度

只有当较矮的墙的高度大于当前列的墙的高度时才能存水,存水量为矮的墙的高度减去当前列的墙的高度。

image.png

代码展示:
class Solution {
public int trap(int[] height) {int sum = 0;//最两端的列不用考虑,因为一定不会有水。所以下标从 1 到 length - 2for (int i = 1; i < height.length - 1; i++) {int max_left = 0;//找出左边最高for (int j = i - 1; j >= 0; j--) {if (height[j] > max_left) {max_left = height[j];}}int max_right = 0;//找出右边最高for (int j = i + 1; j < height.length; j++) {if (height[j] > max_right) {max_right = height[j];}}//找出两端较小的int min = Math.min(max_left, max_right);//只有较小的一段大于当前列的高度才会有水,其他情况不会有水if (min > height[i]) {sum = sum + (min - height[i]);}}return sum;
}
}

解法三: 动态规划

        在解法二中,对于每一列,我们求它左边最高的墙和右边最高的墙,都是重新遍历一遍所有高度,这里我们可以优化一下。用两个数组记录当前每个列的左右最大值,避免重复遍历。

class Solution {public int trap(int[] height) {int sum = 0;//用来存放当前的左端最大值int[] max_left = new int[height.length];//用来存放当前的右端最大值int[] max_right = new int[height.length];//如果即将存入的的高度大于当前左端最大值,则替换最大值for (int i = 1; i < height.length - 1; i++) {max_left[i] = Math.max(max_left[i - 1], height[i - 1]);}//如果即将存入的的高度大于当前右端最大值,则替换最大值for (int i = height.length - 2; i >= 0; i--) {max_right[i] = Math.max(max_right[i + 1], height[i + 1]);}//找出两端较小的,只有较小的一段大于当前列的高度才会有水,其他情况不会有水for (int i = 1; i < height.length - 1; i++) {int min = Math.min(max_left[i], max_right[i]);if (min > height[i]) {sum = sum + (min - height[i]);}}return sum;}
}

解法四:双指针

        动态规划中,我们常常可以对空间复杂度进行进一步的优化。例如这道题中,可以看到,max_left [ i ] 和 max_right [ i ] 数组中的元素我们其实只用一次,然后就再也不会用到了。所以我们可以不用数组,只用两个指针就行了。

首先比较当前列左右两墙的高度大小,将那个较小的与当前列进行比较

class Solution {public int trap(int[] height) {int sum = 0,maxleft = 0,maxright = 0;//左指针加进去int left = 1;// 加右指针进去int right = height.length - 2; for (int i = 1; i < height.length - 1; i++) {//如果左指针的前一个值小于右指针的后一个值if (height[left - 1] < height[right + 1]) {//那么从左到右更,记录当前左端最大值maxleft = Math.max(maxleft, height[left - 1]);//如果当前左指针指向的高度小于左墙,则两者的高度差即为存水量if (maxleft > height[left]) {sum = sum + (maxleft - height[left]);}left++;} //否则从右到左更,记录当前右端最大值else {maxright = Math.max(maxright, height[right + 1]);//如果当前右指针指向的高度小于右墙,则两者的高度差即为存水量if (maxright  > height[right]) {sum = sum + (maxright  - height[right]);}right--;}}return sum;}
}

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

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

相关文章

某铁路信息中心运营监测项目

某铁路信息中心承担大量实时监测、例行巡检和排障维护等工作&#xff0c;为巩固信息化建设成果&#xff0c;提高整体运维效果&#xff0c;保障铁路信息系统稳定运行&#xff0c;需对现有网络监测系统进行升级改造。 设备类型&#xff1a;服务器、交换机、数据库、中间件、虚拟…

js时间换算

1、根据HH::mm:ss以及提前或延迟的分钟数得出具体时间及偏移量 timeString格式为HH:mm:ss&#xff1b;minutesOffset有正负&#xff0c;正代表延后&#xff0c;负代表提前&#xff1b;返回值中dayOffset表示偏移量&#xff0c;0表示当天&#xff0c;1表示次日&#xff0c;-1表…

【数据结构】树与二叉树——二叉树的概念

二叉树的概念 导读一、二叉树的定义及其主要特性1.1 二叉树的定义1.2 二叉树的主要特性 二、特殊的二叉树2.1 满二叉树2.2 完全二叉树2.3 二叉排序树2.4 平衡二叉树 三、二叉树的性质3.1 性质一3.2 性质二3.3 性质三3.4 性质四3.5 性质五 结语 导读 大家好&#xff0c;很高兴又…

C# 生成解决方案时出现的一些异常及解决方法

一、ResolveAssemblyReference任务意外失败 在使用VS2022生成C#解决方案时&#xff0c;出现如下错误&#xff1a; 解决方法&#xff1a; 项目的依赖项出现问题&#xff0c;重新更新一下依赖项即可 二、生成Win32资源时出错 产生这个原因的主要原因是配置的应用程序的图标文…

一个 python+tensorFlow训练1万张图片分类的简单直观例子( 回答由百度 AI 给出 )

问题&#xff1a;给定一个文件夹 train_images&#xff0c;里面有10000张30*30像素的灰度值图片&#xff0c;第1~第10000张图片的名称分别为 00001.png、 00002.png、... 09999.png、10000.png,train_images 下面还有一个 image_category_map.txt文件&#xff0c; 文件的内容…

04.docker的主要组成部分

docker体验 docker是传统的CS架构分为docker client和docker server,跟mysql一样 查看版本命令&#xff1a;docker version 查看docker下载的是社区版,ce代表社区 rpm -qa |grep docker 查看docker系统命令 docker system docker info&#xff08;如果要做监控&#xff…

黄仁勋的AI时代:英伟达GPU革命的狂欢与挑战

在最近的COMPUTEX 2024大会上&#xff0c;英伟达创始人黄仁勋发布了最新的Blackwell GPU。这次发布不仅标志着英伟达在AI领域的又一次飞跃&#xff0c;也展示了其对未来技术发展的战略规划。本文将详细解析英伟达最新技术的亮点&#xff0c;探讨其在AI时代的市场地位和未来挑战…

【UE5 刺客信条动态地面复刻】实现无界地面01:动态生成

2024.6.4更新 昨天半夜意识到生成Cube的方案不合适&#xff0c;又开始到处找动态地面的方法&#xff0c;发现了我想要的效果直接可以用nigara实现&#xff01;&#xff01;&#xff01;&#xff01; 于是这个部分就暂时告一段落&#xff0c;今季开始新的方向的学习。 为了快速…

thingsboard告警发送邮件的最新方式

ThingsBoard3.2及以上版本引入警报规则进行简化配置过程而无需通过规则引警进行配置只需要使用”Device Profile”即可&#xff0c;因为在以前的版本中需要一定的编程技巧才能完成。 新的报警发送邮件如下图流程&#xff0c;重点是增加customer details,配置Select details&am…

程序员的灵魂究竟是什么

程序员应该有什么职业素养&#xff1f; 我们曾经都认为自己是世界的中心 我们曾经都认为自己不是世界的中心 我们终究会认为自己是自己世界的中心 方向一&#xff1a;沟通能力 能说让对方听懂的话&#xff0c;能听懂对方的话&#xff0c;能转达其他人的话 方向二&#xff1a;…

wpf窗体背景添加径向渐变效果实现

<Window.Background> <!--镜像渐变--> <RadialGradientBrush Center"0.5,0" GradientOrigin"0.5,-0.5" RadiusX"0.7" RadiusY"1.2"> <GradientStop Color"#ff61baff" Offset"0&q…

争当大模型时代基础设施,大厂打响大模型价格战

大模型的价格正在进入一个比低更低的时代。只是&#xff0c;让价格成为竞争主导因素&#xff0c;是否会有些操之过急&#xff1f;本文作者分享了他的观点和分析&#xff0c;一起来看。 似乎&#xff0c;每一家厂商都有一个成为大模型时代基础设施的梦想&#xff0c;为此&#x…

递归出java实体类中所有带@Schema注解且有复杂类型属性List<T>泛型类型

一、问题描述&#xff1a; Excel表格导出实体类中所需要的字段&#xff0c;在不借助数据库字典表存储字段的情况下&#xff0c;且实体类属性中除去基本类型外还有List<T>复杂类型&#xff0c;如何实现&#xff1f; 二&#xff1a;问题分析&#xff1a; 核心问题1&…

Pandas读取文本文件为多列

要使用Pandas将文本文件读取为多列数据&#xff0c;你可以使用pandas.read_csv()函数&#xff0c;并通过指定适当的分隔符来确保正确解析文件中的数据并将其分隔到多个列中。 假设你有一个以逗号分隔的文本文件&#xff08;CSV格式&#xff09;&#xff0c;每一行包含多个值&a…

SpringBoot注解--06--JSRValidatorUtil

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 Spring Validation数据校验Spring ValidationSpring 提供的数据校验方式&#xff1a;依赖引入&#xff1a;Spring Validation常用的注解 手动校验&#xff1a;通过 …

表 ,索引的 degree 检查, trim(degree) default INSTANCES

检查degree >1 的 select substr(owner,1,15) Owner , ltrim(degree) Degree, ltrim(instances) Instances, count(*) "Num Tables" , Parallel from dba_tables where ( trim(degree) > 1 ) and table_name not like ET$% group by owner, degree , ins…

电商平台接口|获取价格数据,做好竞品分析

京东获得JD商品详情 API返回值说明 item_get-获得JD商品详情 jd.item_get 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[it…

Springboot 在线学习交流平台-计算机毕业设计源码46186

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;在线学习交流平台当然也不能排除在外。在线学习交流平台是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法…

飞睿uwb定位tag防丢器,蓝牙智能防丢器原理,支持苹果IOS的本地防丢查找

在当今这个快节奏的社会&#xff0c;人们的注意力经常被各种琐事分散&#xff0c;丢三落四的情况时有发生。随着科技的发展&#xff0c;智能防丢器应运而生&#xff0c;成为帮助我们解决这一烦恼的助手。今天&#xff0c;我们就来深入探讨一款备受瞩目的智能防丢产品——飞睿UW…

CDH6.3.2安装文档

前置环境&#xff1a; 操作系统&#xff1a; CentOS Linux release 7.7 java JDK &#xff1a; 1.8.0_231 1、准备工作 准备以下安装包&#xff1a; Cloudera Manager: cloudera-manager-agent-6.3.1-1466458.el7.x86_64.rpm cloudera-manager-daemons-6.3.1-1466458.el…