LeetCode接雨水

news2024/12/25 0:33:09

题目描述

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

解题思路

1、首先题目的要求是求解出所有排列的柱子,下雨之后能接多少雨水,我们可以先求解出每一列上所能接雨水的面积
在这里插入图片描述
2、那么如何求解当前位置(每一列)上的面积呢?

因为宽度为1,所以每一列上的面积=Math.min(left_max[i],right_max[i])-height[i];

在这里插入图片描述
开两个数组先记录下当前位置上左右两边高度的最大值,通过遍历不断更新最大值来记录

/**
 * @param {number[]} height
 * @return {number}
 */
var trap = function(height) {
  let n=height.length;
  if(n===0) return 0;
  let res=0;

  let left_max=[] ,right_max=[];
  //记录左边数组的最大值
  left_max[0]=height[0];
  for(let i=1;i<n;i++){
    left_max[i]=Math.max(left_max[i-1],height[i]);
  }
  //记录右边数组的最大值
  right_max[n-1]=height[n-1];
  for(let i=n-2;i>=0;i--){
    right_max[i]=Math.max(right_max[i+1],height[i]);
  }
  //统计每一列的面积之和
  for(let i=0;i<n;i++){
    res+=Math.min(left_max[i],right_max[i])-height[i];
  }
  return res;
};

代码分析:

这段代码定义了一个名为 trap 的函数,用于解决经典的“接雨水”问题。该问题要求计算给定整数数组(代表柱状图中各个柱子的高度)中可以接住的雨水量。以下是对代码的逐行解释:

1、函数定义:

var trap = function(height) {

定义了一个名为 trap 的函数,接受一个名为 height 的数组参数。

2、初始化变量:

let n = height.length;
let res = 0;
  • n 用于存储数组 height 的长度。
  • res 初始化为 0,用于累加可以接住的雨水总量。

3、边界条件检查:

if (n === 0) return 0;

如果数组长度为 0,直接返回 0,因为没有雨水可以接住。

4、初始化左右最大值数组:

let left_max = [], right_max = [];
  • left_max 数组用于存储每个位置左侧的最大高度。
  • right_max 数组用于存储每个位置右侧的最大高度。

5、填充左侧最大值数组:

left_max[0] = height[0];
for (let i = 1; i < n; i++) {
    left_max[i] = Math.max(left_max[i - 1], height[i]);
}
  • 首先,将 left_max 的第一个元素设置为 height 的第一个元素。
  • 然后,使用一个循环从第二个元素开始,每个元素的高度设置为它左侧元素的高度和当前元素高度中的较大者。

6、填充右侧最大值数组:

right_max[n - 1] = height[n - 1];
for (let i = n - 2; i >= 0; i--) {
    right_max[i] = Math.max(right_max[i + 1], height[i]);
}
  • 首先,将 right_max 的最后一个元素设置为 height 的最后一个元素。
  • 然后,使用一个循环从倒数第二个元素开始,每个元素的高度设置为它右侧元素的高度和当前元素高度中的较大者。

7、计算雨水量:

for (let i = 0; i < n; i++) {
    res += Math.min(left_max[i], right_max[i]) - height[i];
}
  • 遍历整个 height 数组。
  • 对于每个元素,计算左侧最大高度和右侧最大高度中的较小值,然后减去当前高度,得到当前位置可以接住的雨水量。
  • 将这个值累加到 res 中。

8、返回结果:

return res;

返回计算得到的雨水总量。

总结

这个函数通过分别计算每个位置左右两侧的最大高度,然后取较小者减去当前高度,来确定每个位置可以接住的雨水量。这种方法的时间复杂度是 O(n),因为每个数组元素只被访问一次。空间复杂度是 O(n),因为使用了两个额外的数组来存储左右两侧的最大高度。

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

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

相关文章

深入SpringBoot:SpringCache的集成与使用

目录 一、SpringCache集成声明式与编程式1. 引入依赖2. SpringCache配置3. key的设置4. 使用 二、SpringCache使用1. 基于声明式注释的缓存1.1 Cacheable注解1.2 Cacheable注解属性1.2.1 CacheManager和CacheResolver1.2.2 cacheName1.2.3 key和KeyGenerator1.2.4 同步缓存 2. …

Linux 内核源码分析---处理 VFS 对象及标准函数

处理VFS对象 注册文件系统&#xff1a;在文件系统注册到内核时&#xff0c;文件系统是编译为模块&#xff0c;或者持久编译到内核中。 fs/super.c 中的register_filesystem用来向内核注册文件系统。我们可以通过/proc/filesystems查看系统所有的文件系统类型。 一个文件系统不…

Idea绿色下载安装教程-最新,2024版本通用-附下载链接

插件链接&#xff1a; 脚本 Idea下载安装完成后 进入激活码输入页面&#xff0c;然后关闭IDEA 按照下面流程进行激活 1. 按照以下步骤&#xff0c;亲测可用&#xff0c;记得一定要先关闭idea 2. 选择对应软件 3.选择bin、目录对应选项 5.激活 6.成功

MySQL--读写分离与分布式存储

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、读写分离 1、什么是读写分离 在数据库集群架构中&#xff0c;让主库负责处理写入操作&#xff0c;而从库只负责处理select查询&#xff0c;让两…

部署MySQL数据库时常见错误

登录数据库 时&#xff0c;可能会出现如图错误 1.确认是否部署MySQL服务 2.过滤MySQL端口号&#xff0c;查看服务是否开启&#xff08;如图上半部分&#xff0c;则是服务未开启&#xff09; 3.如图部分&#xff0c;则是密码错误 4.如果忘记了 mysql 的密码&#xff0c;或者登陆…

Apple Vision Pro 游戏开发:挑战与反思

随着Apple Vision Pro的推出,许多游戏开发者开始尝试在这个全新的平台上构建沉浸式的虚拟现实体验。然而,开发者们很快发现,在这个新兴领域中面临着不少挑战,包括支付延迟、技术支持不足、设备性能限制等问题。本文将探讨这些挑战,并提出一些开发者需要注意的关键点。 支…

Qt:自定义钟表组件

使用QWidget绘制两种钟表组件&#xff0c;效果如下&#xff1a; 源码下载链接&#xff1a;GitHub - DengYong1988/Clock-Widget: Qt 自定义钟表组件 https://download.csdn.net/download/ouyangxiaozi/89616407 主要代码如下&#xff1a; ClockWgt.h #ifndef CLOCKWGT_H #d…

spring源码阅读-推断构造方法

如何构造一个对象&#xff1f; 1、默认情况下&#xff0c;或者只有一个构造方法的情况下&#xff0c;就会使用默认构造方法或者唯一的一个构造方法 2、由程序员指定构造方法入参值&#xff0c;通过getBean()的方式获取&#xff0c;可以指定参数类型以及个数&#xff0c;但是该…

【康复学习--LeetCode每日一题】572. 另一棵树的子树

题目&#xff1a; 给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree …

SpringBoot3里的文件上传

需求分析&#xff1a; 在用户更换头像或者添加文章时&#xff0c;都需要携带一个图片的URL访问地址。当用户访问文件上传接口将图片的数据上传成功后&#xff0c;服务器会返回一个地址。我们后台需要提供一个文件上传的接口&#xff0c;用来接收前端提交的文件的数据并且返回文…

C++入门基础(完整版)含下卷

C入门基础 hello 各位未来的程序员大佬们&#xff0c;这一篇是详细介绍入门基础&#xff0c;和上一篇不同的是这一篇补完了引用的知识和inline&#xff0c;nullptr的知识&#xff0c;希望大家有所收获 namespace的价值 在C/C中&#xff0c;变量、函数和后⾯要学到的类都是⼤…

【w门大学】云计算与大数据零基础特训班视频教程合辑

提取地址 云计算与大数据零基础特训班 课程目录

“数据要素×”大赛江西分赛官网正式上线 共设置12个赛道

7月17日&#xff0c;2024年“数据要素”大赛江西分赛在南昌市拉开帷幕。作为全国“数据要素”大赛的地方分赛&#xff0c;江西分赛由国家数据局、江西省人民政府指导&#xff0c;江西省发展改革委&#xff08;省数据局&#xff09;联合18家省级单位共同主办&#xff0c;江西分赛…

CCRC-DSA数据安全评估师:ISC.AI2024数字安全峰会:安全大模型引领安全行业革命

7月31日&#xff0c;以“构建先进的安全模型&#xff0c;引领安全产业变革”为主题&#xff0c;ISC.AI 2024数字安全峰会在北京国家会议中心成功举办。 本次峰会旨在鼓励行业通过大规模模型重构安全框架&#xff0c;确保数字经济的稳健前进。 会上&#xff0c;众多院士级专家…

【pytorch】全连接网络简单二次函数拟合

下面是一个使用PyTorch实现全连接网络来拟合简单二次函数 y x 2 y x^2 yx2 的示例。我们将创建一个简单的神经网络&#xff0c;定义损失函数和优化器&#xff0c;并进行训练。 下面是完整的代码示例&#xff1a; import torch import torch.nn as nn import torch.optim …

Linux笔记(1)

在敲出 文件 &#xff0f; 目录 &#xff0f; 命令 的前几个字母之后&#xff0c;按下 tab 键 如果输入的没有歧义&#xff0c;系统会自动补全 如果还存在其他 文件 &#xff0f; 目录 &#xff0f; 命令 &#xff0c;再按一下 tab 键&#xff0c;系统会提示可能存在的命令 小…

【算法速刷(5/100)】LeetCode —— 20.有效的括号

题目要求比较明晰简洁&#xff0c;编码难度并不算高 下面贴出代码和思路 bool isValid(string s) {stack<char> stk;for(const char& c : s){if(stk.empty()){stk.push(c);continue;}if(c ( || c [ || c {){stk.push(c);continue;}else{char top stk.top();boo…

Java Lambda表达式总结(快速上手图解)

Java Lambda表达式总结&#xff08;快速上手详解&#xff09;-CSDN博客https://blog.csdn.net/m0_66070037/article/details/140912566?spm1001.2014.3001.5501

idea 设置自动移除多余 的import (或整个项目删除)

1、开发的时候&#xff0c;直接自动去除多余的引入 2、如果想把整个项目的移除可以如下操作

Linux 异常 sh: /usr/bin/xauth: not found

异常原因&#xff1a; 远程连接时出现错误&#xff0c;由于 Omega 上没有 X 环境&#xff0c;因此在尝试交换凭据以设置转发时会失败 解决办法&#xff1a; 进入高级 SHH 设置&#xff0c;并勾选了 X11 转发。取消勾选该框。