LeetCode_Array_42. Trapping Rain Water 接雨水【双指针】【Java】【困难】

2023-11-19

目录

一,题目描述

英文描述

中文描述

示例与说明

二,解题思路

三,AC代码

Java

四,解题过程

第一搏

第二搏


一,题目描述

英文描述

Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it can trap after raining.

中文描述

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

示例与说明

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/trapping-rain-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二,解题思路

核心思路:对于每一个位置i,只需要知道该位置左右两侧最高的柱子高度,即可求出该位置能存储的水量。

一种非常巧妙的方法是:用left和right限定左右区间,maxLeft、maxRight记录遍历过程中遇到的最大值。

height[left] <= height[right]时:

  • 若height[left] > maxLeft,则更新maxLeft的值;
  • 否则说明对于当前位置left,左右均有高度大于height[left]的柱子,只需要选择其中较矮的一个,减去height[left]即可。

但注意!由于是左边界在向中间移动,所以左侧柱子的高度必定小于height[right]的高度!!!

而此时maxRight不一定大于height[right](因为还没更新),所以较矮的一定是maxLeft,也就是说ans += (maxLeft - height[left]),而不是ans += (min(maxLeft, maxRight) - height[left])

三,AC代码

Java

class Solution {
    public int trap(int[] height) {
        if (height.length <= 2) return 0;
        int left = 0, right = height.length - 1;// 标记左右边界
        int maxLeft = 0, maxRight = 0;// 记录目前遇到的最大高度,初始化为0!!!
        int ans = 0;
        while (left < right) {
            if (height[left] <= height[right]) {
                if (height[left] > maxLeft) maxLeft = height[left];
                else ans += (maxLeft - height[left]);// !!!到这里表示一定有右边界大于maxLeft,所以只需要取maxLeft即可,而不是取min(maxLeft, maxRight),因为maxRight可能还没来得及更新
                left++;
            } else {
                if (height[right] > maxRight) maxRight = height[right];
                else ans += (maxRight - height[right]);// !!!同上
                right--;
            }
        }
        return ans;
    }
}

四,解题过程

第一搏

数组maxLeft和maxRight分别记录从左到右、从右到左遍历过程中当前位置遇到的最大值,其中maxLeft[i]表示,从左向右遍历到 i 时,遇到的最大值,maxRight同理。

再次遍历数组height,对每一个位置 i 计算ans += (Math.min(maxLeft[i], maxRight[i]) - height[i]);即对每一个位置 i 计算该位置可以存储的最大水量。

class Solution {
    public int trap(int[] height) {
        if (height.length <= 2) return 0;
        int[] maxLeft = new int[height.length];// 存储从左到右中最高的柱子高度
        int[] maxRight = new int[height.length];// 存储从右到左中最高的柱子高度
        maxLeft[0] = height[0];
        maxRight[height.length - 1] = height[height.length - 1];
        for (int i = 1; i < height.length; i++) {
            maxLeft[i] = Math.max(maxLeft[i - 1], height[i]);
        }
        for (int i = height.length - 2; i >= 0; i--) {
            maxRight[i] = Math.max(maxRight[i + 1], height[i]);
        }
        int ans = 0;
        for (int i = 1; i < height.length - 1; i++) {
            ans += (Math.min(maxLeft[i], maxRight[i]) - height[i]);
        }
        return ans;
    }
}

额外开两个数组,空间O(n)。 

第二搏

其实在遍历求解过程中,只需要知道当前位置左侧最高的柱子和右侧最高的柱子高度即可。

一种非常巧妙的方法是:用left和right限定左右区间,maxLeft、maxRight记录遍历过程中遇到的最大值。

height[left] <= height[right]时:

  • 若height[left] > maxLeft,则更新maxLeft的值;
  • 否则说明对于当前位置left,左右均有高度大于height[left]的柱子,只需要选择其中较矮的一个,减去height[left]即可。

但注意!由于是左边界在向中间移动,所以左侧柱子的高度必定小于height[right]的高度!!!

而此时maxRight不一定大于height[right](因为还没更新),所以较矮的一定是maxLeft,也就是说ans += (maxLeft - height[left]),而不是ans += (min(maxLeft, maxRight) - height[left])

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode_Array_42. Trapping Rain Water 接雨水【双指针】【Java】【困难】 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 编译器抱怨“缺少返回语句”,即使不可能达到缺少返回语句的条件

    在下面的方法中 编译器抱怨缺少退货声明即使该方法只有一条路径 并且它包含一个return陈述 抑制错误需要另一个return陈述 public int foo if true return 5 鉴于Java编译器可以识别无限循环 https
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • 将 List 转换为 JSON

    Hi guys 有人可以帮助我 如何将我的 HQL 查询结果转换为带有对象列表的 JSON 并通过休息服务获取它 这是我的服务方法 它返回查询结果列表 Override public List
  • 节拍匹配算法

    我最近开始尝试创建一个移动应用程序 iOS Android 它将自动击败比赛 http en wikipedia org wiki Beatmatching http en wikipedia org wiki Beatmatching 两

随机推荐

  • Codeforces 1475C. Ball in Berland(二元容斥)

    题目传送门 题意 一个班级有a个男生和b个女生 现在这个班级有k对男女愿意一起出席毕业典礼 这里注意k对男女中可能会有某个男生或女生出现在多个pair中 你从这k对中找出两对 使得这两对中的男生不相同 女生不相同 即一个男生或女生不可能在一
  • cuda 矩阵乘法,从最容易理解到算得最快(第二版源码-tile机制+共享内存)

    下面我们仅仅引入tiling方法 在共享内存中进行分块矩阵的乘法运算 先分析一下能够减少多少次对全局存储区的访问 当M N K 4096时 用第一版的代码 忽略cache的缓存时 需要从全局存储区读取2 4096 3 个float变量 为了
  • 法拉利虚拟学院2010 服务器,法拉利虚拟学院2010

    意大利著名好车品牌 法拉利 一直在世界上享受名誉 该游戏作品将带领玩家感悟法拉利的文化底蕴 游戏介绍 法拉利虚拟学院2010 包括了2010款法拉利F1赛车F10 以及三条通过镭射扫描技术绘制的高精度赛道 Fiorano Mugello N
  • spring boot 简介以及作用

    我们都知道spring是一个功能非常强大的框架 但是它也存在非常不好的弱点 也是对于我们普通的程序员的致命的弱点 就是它的配置文件太多了 而 在开发界一直有一句话 就是约定大于配置 这样一句话 就是说系统 类库 框架应该假定合理的默认值 而
  • JsonObject对象和jsonArrsy数组的获取JDK1.8,添加到表中

    1 基础数据结构 一个合同号对应多个批号 一个批号对应多个车辆 arrivalReport contractContent contractNumber 2021 11 17合同号 orderNumber 2021 11 17 0032订单
  • AbstractQueuedSynchronizer之AQS

    文章目录 AbstractQueuedSynchronizer AQS 概述 基本原理 实现细节 等待队列 state属性 独占模式 ReentrantLock AbstractQueuedSynchronizer AQS 概述 Abstr
  • 爬虫学习笔记(十五)——加密解密

    文章目录 一 概念和作用 1 1 概念 1 2 作用 1 3 常用加密方式 二 字符编码 2 1 进制间转换方法 python 2 2 unicode 三 Base64编码原理 3 1 概念 3 2 作用 3 3 Base64编码表 3 4
  • MySQL备份与恢复

    2 3 1备份MySQL数据库 在MySQL的bin目录下 有一个名为mysqldump的可执行文件 将该bin目录添加到环境变量中 可以利用它在 命令提示符 环境下来备份数据库 语法格式如下 mysqldump opt 要备份的数据库名
  • 词项(term)与词条(token)区别

    传送门
  • Sublime Text 3 全程详细图文教程(转载)

    今天被群里大佬安利了一款文本编辑软件 找了一下相关教程 一 前言 使用Sublime Text 也有几个年头了 版本也从2升级到3了 但犹如寒天饮冰水 冷暖尽自知 最初也是不知道从何下手 满世界地查找资料 但能查阅到的资料 苦于它们的零碎
  • 系统CPU飙高和频繁GC,我要怎么排查

    1 Full GC次数过多 相对来说 这种情况是最容易出现的 尤其是新功能上线时 对于Full GC较多的情况 其主要有如下两个特征 线上多个线程的CPU都超过了100 通过jstack命令可以看到这些线程主要是垃圾回收线程 通过jstat
  • 理解图像的傅里叶变换(细心分析)

    最近在看图像的傅里叶变换 看着频谱图一直没看明白到底为啥是那样的 跟同学研究了好久 终于想明白了 感谢同学的耐心指导 大家相互讨论真的很快就能出结果 多讨论 多学习 图像的傅里叶变换 图像是一个二维的信号 所以对它进行二维的傅里叶变换 对于
  • layui文件上传接口后端具体实现SpringMVC

    做课程设计时候 用到了layui文件上传接口 参考官方文档给出的响应接口文档 code 0 msg data src http cdn layui com 123 jpg 然后具体的上传书写方式分为前端和后端 layui官方并没有说明上传的
  • [1140]linux查看历史命令history

    一 什么是history 在bash功能中 它能记忆使用过的命令 这个功能最大的好处就是可以查询曾经做过的举动 从而可以知道你的运行步骤 那么就可以追踪你曾下达过的命令 以作为除错的工具 二 History的保存 那么命令记录在哪里呢 在h
  • tomcat数据源配置多个ip oracle,tomcat里配置多数据源(数据库连接池) jndi 和项目连接 ssh框架...

    以mysql和oracle数据库为例 我项目以mysql为主 但需要去一个oracle数据库里查询数据 所以只有mysql里表的实体类 但没有oracle数据库实体类 所以配置mysql的数据源有实体类直接把数据源放到session工厂里用
  • 如何修改文件权限

    改变文件权限的两种方法 第一种 符号 sudo chmod 文件身份 操作符 权限符号 文件档案或目录 文件的四种身份 u user文件所有者 g group 文件所属群组 o other 其他拥有者 a all 全部身份 操作符的三种类
  • 4.1 不定积分的概念与性质

    思维导图 学习目标 学习不定积分 我会采取以下几个步骤 1 学习基本的积分表 首先 我会学习基本的积分公式 例如幂函数 指数函数 三角函数 反三角函数等的积分公式 这些公式是不定积分计算的基础 掌握它们是十分重要的 2 理解积分的定义和性质
  • FLOPS、TOPS和FLOPs的区别

    FLOPS 即每秒浮点运算次数 是每秒所执行的浮点运算次数 Floating point operations per second 缩写 FLOPS 的简称 被用来评估电脑效能 FLOPs 注意s小写 是floating point op
  • Android C2DM学习——云端推送

    一 基础知识 当我们开发需要和服务器交互的应用程序时 基本上都需要获取服务器端的数据 比如 地震及时通 就需要及时获取服务器上最新的地震信息 要获取服务器上不定时更新的信息一般来说有两种方法 第一种是客户端使用Pull 拉 的方式 隔一段时
  • LeetCode_Array_42. Trapping Rain Water 接雨水【双指针】【Java】【困难】

    目录 一 题目描述 英文描述 中文描述 示例与说明 二 解题思路 三 AC代码 Java 四 解题过程 第一搏 第二搏 一 题目描述 英文描述 Given n non negative integers representing an el