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

二、思路分析

本题的解法有很多,这里使用动态规划进行解答。首先,动态规划是:通过将原问题分解为相对简单的子问题的方式求解复杂问题的方法。

根据本题题意,我们需要找到存在凹槽的地方,这样才能够积攒雨水。首先创建两个数组,maxLeft [i] 代表第 i 列左边最高的墙的高度,maxRight [i] 代表第 i 列右边最高的墙的高度。(要注意下,第 i 列左(右)边最高的墙,是不包括自身的)

对于 maxLeft 我们可以这样求:

maxLeft[i] = Math.max(maxLeft[i - 1], height[i - 1]); 它前边的墙的左边的最高高度和它前边的墙的高度选一个较大的,就是当前列左边最高的墙了。

对于 maxRight 我们可以这样求:

maxRight[i] = Math.max(maxRight[i + 1], height[i + 1]); 它后边的墙的右边的最高高度和它后边的墙的高度选一个较大的,就是当前列右边最高的墙了。

三、代码参考

1、Java

class Solution {public int trap(int[] height) {// 用来计算最终结果,初始值为 0int sum = 0;// 创建数组 maxLeft,用来表示第 i 列左边最高的墙int[] maxLeft = new int[height.length];// 创建数组 maxRight,用来表示第 i 列右边最高的墙int[] maxRight = new int[height.length];// 循环遍历,获得数组中每一列左边最高的墙for(int i = 1; i < height.length; i++){// 获得第 i 列左边最高的墙maxLeft[i] = Math.max(maxLeft[i - 1], height[i - 1]);}// 循环遍历,获得数组中每一列右边最高的墙for(int i = height.length - 2; i >= 0; i--){// 获取第 i 列右边最高的墙maxRight[i] = Math.max(maxRight[i + 1], height[i + 1]);}// 通过 maxLeft 和 maxRight 两个数组来获取第 i 列左右两边的墙谁最矮,因为凹槽的积水面积的高度取决于矮的一边for(int i = 1; i < height.length; i++){// 获取第 i 列左右两边墙高度最小的值int min = Math.min(maxLeft[i], maxRight[i]);// 如果有凹槽,即当前列的高度小于列左右两边最小的高度if(min > height[i]){// 计算当前列的积水面积,并汇总sum = sum + (min - height[i]);}}// 返回结果return sum;}
}

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

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

相关文章

OpenSSL——升级

OpenSSL&#xff08;Open Secure Sockets Layer&#xff09;是一个开源的软件库&#xff0c;提供了SSL和TLS协议的实现&#xff0c;用于加密通信。它广泛用于安全连接&#xff0c;例如在网站上通过HTTPS协议进行安全的数据传输. 但是从openssl申请道德证书是不安全的。对于网站…

SpringBoot学习(二)-SpringBoot Web 开发

注&#xff1a;此为笔者学习狂神说SpringBoot的笔记&#xff0c;其中包含个人的笔记和理解&#xff0c;仅做学习笔记之用&#xff0c;更多详细资讯请出门左拐B站&#xff1a;狂神说!!! SpringBoot Web 开发 1、静态资源 1&#xff09;创建项目 2&#xff09;做项目都先测试一…

关于“Python”的核心知识点整理大全64

目录 20.2.15 确保项目的安全 settings.py 20.2.16 提交并推送修改 20.2.17 创建自定义错误页面 1. 创建自定义模板 500.html settings.py settings.py 注意 views.py 20.2.18 继续开发 往期快速传送门&#x1f446;&#xff08;在文章最后&#xff09;&#xff1a…

【Redis】非关系型数据库之Redis的介绍及安装配置

目录 前言 一、关系型数据库与非关系型数据库 1.1关系型数据库 1.2非关系型数据库 1.3两者的区别 1.4非关系型数据库产生的背景 1.5总结 二、Redis介绍 2.1Redis是什么 2.2Redis的优点 2.3Redis的使用场景 2.4那些数据适合放在缓存中 2.5Redis为什么那么快&#xf…

学习笔记——C++运算符之逻辑运算符

作用&#xff1a;用于根据表达式的真值返回真值或假值 逻辑运算符有以下符号&#xff1a; #include<bits/stdc.h> using namespace std; int main(){// 逻辑运算符 非 !int a10;//在c中&#xff0c;除了0均是真 cout<<!a<<endl;//0 cout<<!!a<<…

基于多目标粒子群算法的支配解求解,基于多目标粒子群的帕累托前沿求解,基于mopso的多目标求解,基于多目标粒子群的模糊优化算

目录 摘要 测试函数shubert 粒子群算法的原理 粒子群算法的主要参数 粒子群算法原理 基于多目标粒子群算法的支配解求解,基于多目标粒子群的帕累托前沿求解,基于mopso的多目标求解,基于多目标粒子群的模糊优化算 代码 结果分析 展望 代码下载:基于多目标粒子群算法的支配解…

OS_lab——bochs源码的编译与安装

1. 实验环境VMware station 15 Ubuntu 14.04.6 32位。2. 实验步骤2.1 安装虚拟机&#xff0c;并在虚拟机根目录下编译并安装bochs环境。 2.2 使用bochs自带工具bximage创建虚拟软驱。 2.3 编写引导程序boot.asm并用nasm编译得到引导文件boot.bin和boot.com。 2.4 修改bochs…

使用sentinel作为熔断器

什么是sentinel Sentinel&#xff0c;中文翻译为哨兵&#xff0c;是为微服务提供流量控制、熔断降级的功能&#xff0c;它和Hystrix提供的功能一样&#xff0c;可以有效的解决微服务调用产生的“雪崩”效应&#xff0c;为微服务系统提供了稳定性的解决方案。随着Hytrxi进入了维…

Python笔记01-你好Python

文章目录 Python简介环境安装Hello world开发工具 Python简介 python的诞生 1989年&#xff0c;为了打发圣诞节假期&#xff0c;Gudio van Rossum吉多 范罗苏姆&#xff08;龟叔&#xff09;决心开发一个新的解释程序&#xff08;Python雏形&#xff09; 1991年&#xff0c;第…

labview 与三菱FX 小型PLC通信(OPC)

NI OPC服务器与三菱FX3U PLC通讯方法 一、新建通道名称为&#xff1a;MIT 二、选择三菱FX系列 三、确认端口号相关的参数&#xff08;COM端&#xff1a;7.波特率&#xff1a;9600&#xff0c;数据位&#xff1a;7&#xff0c;校验&#xff1a;奇校验&#xff0c;停止位&#xf…

性能分析与调优: Linux 实现 CPU剖析与火焰图

目录 一、实验 1.环境 2.CPU 剖析 3.CPU火焰图 一、实验 1.环境 &#xff08;1&#xff09;主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系统 prometheus、node_exporter 192.168.204.18grafana监测GUIgrafana192.168.204.19agent 监测 主机 node_exporter192…

UEditor在编辑对齐方式时产生额外空行问题

一、问题描述 一个关于UEditor富文本编辑器的问题&#xff1a;在编辑内容对齐方式后保存后浏览器显示的段落上下会比原先多出一些间距。 下面是对齐编辑后&#xff0c;未保存前的的HTML&#xff1a; 保存后&#xff0c;实际会多出一个段落空行&#xff1a; 二、问题调查 经…