【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;服务器、交换机、数据库、中间件、虚拟…

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

二叉树的概念 导读一、二叉树的定义及其主要特性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资源时出错 产生这个原因的主要原因是配置的应用程序的图标文…

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…

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

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

Pandas读取文本文件为多列

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

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

京东获得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…

视频号小店是什么?没有货源可以去做吗?一篇详解!

大家好&#xff0c;我是电商小V 视频号小店近两年在创业者眼中可以说是一个可以去操作的项目&#xff0c;也是可以激起来很高的讨论度&#xff0c;但是很多小伙伴对视频号小店了解不是很深&#xff0c;今天咱们就来详细的说一下&#xff1a;视频号小店&#xff0c; 视频号小店就…

鸿蒙Ability Kit(程序框架服务)【ServiceExtensionAbility】

ServiceExtensionAbility 概述 [ServiceExtensionAbility]是SERVICE类型的ExtensionAbility组件&#xff0c;提供后台服务能力&#xff0c;其内部持有了一个[ServiceExtensionContext]&#xff0c;通过[ServiceExtensionContext]提供了丰富的接口供外部使用。 本文描述中称被…

EasyV开发人员的使用说明书

在可视化大屏项目时&#xff0c;开发人员通常需要承担以下任务&#xff1a; 技术实现&#xff1a;根据设计师提供的设计稿&#xff0c;利用前端技术&#xff08;如HTML、CSS、JavaScript等&#xff09;和后端技术&#xff08;根据具体项目需求&#xff0c;可能是Java、Python、…

【工具】windows下VMware17解锁mac安装选项(使用unlocker427)

目录 0.简介 1.环境 2.安装前后对比 3.详细安装过程 3.1 下载unlocker427 1&#xff09;下载地址 2&#xff09;下载unlocker427.zip 3&#xff09;解压之后是这样的 4&#xff09;复制iso中的两个文件到你本地的VMware的安装目录下 5&#xff09;复制windows下的所有…

计网期末复习指南(四):网络层(IP协议、IPv4、IPv6、CIDR、ARP、ICMP)

前言&#xff1a;本系列文章旨在通过TCP/IP协议簇自下而上的梳理大致的知识点&#xff0c;从计算机网络体系结构出发到应用层&#xff0c;每一个协议层通过一篇文章进行总结&#xff0c;本系列正在持续更新中... 计网期末复习指南&#xff08;一&#xff09;&#xff1a;计算…

学生在课堂上可以用小风扇吗?五款学生可用迷你手持小风扇分享!

随着夏季的来临&#xff0c;高温酷暑成为了学生日常学习生活中的一大挑战。在闷热的教室里&#xff0c;人多风扇少&#xff0c;闷热的环境很容易就会让人学不下去。因此学生在课堂上最好是使用手持小风扇&#xff0c;但选择的手持小风扇噪音一定要小&#xff0c;不然很容易就会…

HarmonyOS(29)onMeasureSize和PlaceChildren (View的测量和布局)

onMeasureSize和PlaceChildren onMeasureSize和PlaceChildren 说明官方使用示例参考资料 onMeasureSize和PlaceChildren 说明 在Android开发中View的测量onMeasure和布局onLayout是自定义组件必备的两个方法&#xff0c;HarmonyOS对自定义布局也提供了两个方法&#xff1a; on…