首页 > 编程语言 >LeetCode100之接雨水(42)--Java

LeetCode100之接雨水(42)--Java

时间:2024-11-06 18:45:53浏览次数:4  
标签:Java 之接 -- rMaxHeight 高度 雨水 height int length

1.问题描述

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

        难度等级

             困难

        题目链接

               接雨水

2.解题思路

        这道接雨水的题目看着似乎很难,但是真正明白怎么做之后,就会觉得十分简单,话不多说,我们一起来看一下吧。

        每一个位置能接到多少雨水,取决于它这个位置本身的高度和它左右两边最大的高度,左右两边最大高度之中的最小值 减掉它本身的高度就是它这个位置能接到的雨水。为什么是左右两边最大高度的最小值呢?因为雨水上涨到左右两边的最大高等的其中一个时,就没有容器壁挡住它了,再接就会漏出来,最先到达的那个高度就是左右两边最大高度中的较小的那个。

        我们已经知道了每个位置能接多少水的关键,那么解决问题就是要找到这几个关键。本身的高度题目已经给我们了,所以我们只需要计算出每一个位置左右两边的最大高度即可。

        所以我们可以定义两个数组,分别存储左右两边的最大高度,然后通过for循环遍历的方式,获得每个位置左右两边的最大高度。

    //存储左边最大的高度
    int[] lMaxHeight = new int[height.length];
    //存储右边最大的高度
    int[] rMaxHeight = new int[height.length];
    //初始化数组
    lMaxHeight[0] = height[0];
    //计算每个位置左边最大的高度
    for(int i = 1;i < height.length;i++){
        lMaxHeight[i] = Math.max(lMaxHeight[i-1],height[i]);
    }
    //初始化数组
    rMaxHeight[height.length-1] = height[height.length-1];
    //计算每个位置右边最大的高度
    for(int i = height.length - 2;i >= 0;i--){
        rMaxHeight[i] = Math.max(rMaxHeight[i+1],height[i]);
    }

        三个要素都集齐之后,我们只要在每个位置取出左右最大高度的最小值再减去本身的高度,就是这个位置能够接的雨水。值得注意的是,若计算出来的雨水为负数,那其实是本身的高度大于左右两边,是无法接雨水的,所以这部分负数的值我们要舍去。将正数的雨水值累加在一起就是我们想要的答案了。

    int sum = 0;
    //计算能接多少雨水
    for(int i = 1;i < height.length-1;i++){
        //左右两边的最大高度取最小
        int count = Math.min(lMaxHeight[i],rMaxHeight[i]) - height[i];
        if(count > 0){
           sum += count;
        }
    }

3.代码展示

class Solution {
    public int trap(int[] height) {
    //存储左边最大的高度
    int[] lMaxHeight = new int[height.length];
    //存储右边最大的高度
    int[] rMaxHeight = new int[height.length];
    //初始化数组
    lMaxHeight[0] = height[0];
    //计算每个位置左边最大的高度
    for(int i = 1;i < height.length;i++){
        lMaxHeight[i] = Math.max(lMaxHeight[i-1],height[i]);
    }
    //初始化数组
    rMaxHeight[height.length-1] = height[height.length-1];
    //计算每个位置右边最大的高度
    for(int i = height.length - 2;i >= 0;i--){
        rMaxHeight[i] = Math.max(rMaxHeight[i+1],height[i]);
    }
    int sum = 0;
    //计算能接多少雨水
    for(int i = 1;i < height.length-1;i++){
        //左右两边的最大高度取最小
        int count = Math.min(lMaxHeight[i],rMaxHeight[i]) - height[i];
        if(count > 0){
           sum += count;
        }
    }
    return sum;
    }
}

4.总结

        这道题的关键就在于能不能看出它是怎么接雨水的,左右两边最大高度的最小值 - 本身的高度,为正数的那部分就是我们要的雨水。虽然这是一道困难题,但是知道怎么写后,就像我说的,十分简单。就啰嗦到这了,祝大家刷题愉快~

标签:Java,之接,--,rMaxHeight,高度,雨水,height,int,length
From: https://blog.csdn.net/2301_79318558/article/details/143372425

相关文章

  • 基于langchain的RAG问答(QA)链实现
    文章目录概要整体架构流程1.加载JSON数据2.创建文档对象并添加元数据3.初始化嵌入模型4.初始化Chroma向量存储5.向向量数据库添加文档6.基于相似度检索文档7.通过嵌入向量检索相似文档8.初始化检索器9.加载RAG提示模板10.定义RAG链并生成回答总结技......
  • 如何使用YOLOv5来训练——建筑工地安全图像数据集,并附上详细的训练代码和步骤。这个数
    如何使用YOLOv5来训练——建筑工地安全图像数据集,并附上详细的训练代码和步骤。这个数据集包含10个类别,标注为YOLO格式。安全帽面罩安全锥等数据集进行检测建筑工地安全行为图像数据集yolo格式0:“安全帽”,1:“面罩”,2:“无安全帽”、3:“无面罩”、4:“无安全背心”、5:“......
  • 100%吃透Spring 的三级缓存
    在此之前,我们需要了解什么是spring的循环依赖,下面我引用一篇之前的文档此处为语雀内容卡片,点击链接查看:https://www.yuque.com/u41175337/xy9eiy/egcll6gqml0ofb9a然后带你从源码级别debug,一步一步带你探索Spring是如何通过三级缓存来解决循环依赖问题的首先先创建两个类......
  • 如何使用深度学习框架(PyTorch)来训练——147913张图像的超大超详细垃圾分类数据集,并附
    超大超详细垃圾分类数据集(分类,分类),共4大类,345小类,147913张图,已全部分类标注完成,共12GB。厨余垃圾76小类35058张可回收物195类86116张其他垃圾53类16156张有害垃圾18小类10583张 如何使用深度学习框架(如PyTorch)来训练一个包含147913张图像的超大超详细垃圾分类......
  • 使用YOLOv5来训练——井盖状态检测数据集,并使用训练好的模型进行预测井盖状态检测数据
    井盖状态检测数据集yolo格式五种类别:broke(井盖破损),good(完好),circle(边圈破损),lose(井盖丢失),uncovered(井盖位移/未覆盖全)训练数据已划分,配置文件稍做路径改动即可训练。训练集:1217验证集:108 使用YOLOv5来训练一个包含1217张训练图像和108张验证图像的井盖状态检......
  • DolphinScheduler 限制秒级别的定时调度
    背景DolphinScheduler定时任务配置采用的7位Crontab表达式,分别对应秒、分、时、月天、月、周天、年。在团队日常开发工作中,工作流的定时调度一般不会细化到秒级别。但历史上出现过因配置的疏忽大意而产生故障时间,如应该配置每分钟执行的工作流被配置长了每秒执行,造成短时......
  • HNCPC2024
    E拼接串题目描述给出一个长度为\(n\)的正整数串\(a\)。现在可以把两个没有重叠的连续子串前后拼接起来,但是要求拼接之后的数串中每个正整数不能出现超过\(1\)次。请问能拼接出来的符合要求的数字串的最大长度是多少。输入描述第一行一个整数\(n\)\((1\leqn\leq1,......
  • SELinux
      SELinux安全增强式Linux(Security-EnhancedLinux)安全增强式Linux是一个Linux内核的安全模块,其提供了访问控制安全策略机制,包括了强制访问控制。SELinux是一组内核修改和用户空间工具,已经被添加到各种Linux发行版中。其软件架构力图将安全决策的执行与安全策略分离,并......
  • Python 日志分级记录到不同文件的实现
    Python日志分级记录到不同文件的实现介绍如何使用Python的logging模块,按INFO、WARNING和ERROR级别将日志记录到不同的文件中。通过封装CustomLogger类,方便在项目中直接调用,简化日志管理。1.实现目标分级日志记录:将INFO、WARNING、ERROR级别的日志分别记录到不......
  • 链式并查集合并(裸板)
    对于操作:将一段元素合并为同类。在合并\([l,r]\)这一段数的时候,其实有很多数本来就在一个并查集里。我们只需要合并若干个还没有合并的并查集,而不需要从\(l\)到\(r\)一个一个合并。因为只要合并了这几个并查集,效果等价于把\([l,r]\)直接合并了。实现方法:每次记录一个......