当前位置: 首页 > article >正文

【JS】接雨水题解

题目

思路

  • 首先我们要明确如何计算每条柱子的接水量:
    • 每条柱子对应接到的雨水量=该柱子左边最大值和右边最大值中的较小值-该柱子本身的高度。
    • 举例:第二条柱子自身高度为0,左边最大值为1,右边最大值为3,取较小值1-自身高度0=接水量1
  • 该题暴力解法思路:第一层遍历每根柱子,第二层需要分别遍历该柱子的左边和右边,找出最大值,再计算该柱子的接水量。本文采用双指针法,可以在暴力解法基础上优化复杂度,以下为双指针法思路讲解。
  • 根据计算方法可知,我们计算每根柱子接水量都要找左右两边的最大值,所以我们可以将每根柱子对应的左右两边最大值先计算出来分别存在两个数组中,计算每根柱子接水量时可以直接使用,不用再分别去做左右两边最大值的比较,以下是如何拿到左右最大值数组思路:
    • 左边
      • 初始化一个与高度数组 height 长度相同的数组 leftMax,用于存储每个位置左边的最大值。
      • 从数组的第一个元素(索引为 0)开始遍历高度数组 height
      • 对于第一个元素,它左边没有其他元素,所以 leftMax[0] = height[0]
      • 对于后续的元素(索引 i > 0),leftMax[i] 等于 height[i] 和 leftMax[i - 1] 中的较大值,即 leftMax[i] = Math.max(height[i], leftMax[i - 1])。通过这种方式,在遍历过程中不断更新每个位置左边的最大值。
    • 右边的计算方式和左边相似,只是反向比较而已。
  • 在得到左右两边最大值数组后,就可以遍历题目给出的高度数组,根据前面的计算方式算出每个柱子接水量再逐一相加,得到总雨水量。

代码示例

// 使用双指针法解决接雨水问题
var trap = function (height) {// 获取高度数组的长度const len = height.length;// 如果数组长度小于等于2,无法形成可以接水的区域,直接返回0if (len <= 2) return 0;// 创建一个长度为len的数组maxLeft,初始值都为0,用于记录每个柱子左边的最大高度const maxLeft = new Array(len).fill(0);// 创建一个长度为len的数组maxRight,初始值都为0,用于记录每个柱子右边的最大高度const maxRight = new Array(len).fill(0);// 初始化maxLeft数组的第一个元素,即第一个柱子左边的最大高度就是它自身的高度maxLeft[0] = height[0];// 遍历从第二个柱子(索引为1)到最后一个柱子(索引为len - 1)for (let i = 1; i < len; i++) {// 更新当前柱子左边的最大高度,取当前柱子高度和它左边已记录的最大高度中的较大值maxLeft[i] = Math.max(height[i], maxLeft[i - 1]);}// 初始化maxRight数组的最后一个元素,即最后一个柱子右边的最大高度就是它自身的高度maxRight[len - 1] = height[len - 1];// 从倒数第二个柱子(索引为len - 2)开始向前遍历到第一个柱子(索引为0)for (let i = len - 2; i >= 0; i--) {// 更新当前柱子右边的最大高度,取当前柱子高度和它右边已记录的最大高度中的较大值maxRight[i] = Math.max(height[i], maxRight[i + 1]);}// 用于记录可以接住的雨水总量let sum = 0;// 遍历每个柱子(从索引0到len - 1)for (let i = 0; i < len; i++) {// 计算当前柱子可以接住的雨水量,等于它左右两边最大高度的较小值减去自身高度let count = Math.min(maxLeft[i], maxRight[i]) - height[i];// 如果计算出的雨水量大于0,说明当前柱子可以接住雨水,将其累加到总量sum中if (count > 0) sum += count;}// 返回最终可以接住的雨水总量return sum;
};

欢迎指正! 

相关文章:

【JS】接雨水题解

题目 思路 首先我们要明确如何计算每条柱子的接水量&#xff1a; 每条柱子对应接到的雨水量该柱子左边最大值和右边最大值中的较小值-该柱子本身的高度。举例&#xff1a;第二条柱子自身高度为0&#xff0c;左边最大值为1&#xff0c;右边最大值为3&#xff0c;取较小值1-自身…...

线代[12]|《高等几何》陈绍菱(1984.9)(文末有对三大空间的分析及一个合格数学系毕业生的要求)

文章目录 一、概述二、平面仿射几何的基本概念三、平面射影几何的基本概念四、变换群和几何学五、二次曲线的射影理论、仿射理论和度量理论六、射影几何公理基础七、非欧几里得几何概要八、自我测试题九、欧氏解析几何、仿射解析几何、射影解析几何与其他&#xff08;博主借助A…...

第3课:状态管理与事件处理

第3课&#xff1a;状态管理与事件处理 学习目标 掌握useState Hook的使用理解组件事件处理机制实现表单输入与状态绑定完成任务添加功能原型 一、useState基础 1. 创建第一个状态 新建src/Counter.js&#xff1a; import { useState } from react;function Counter() {co…...

提升移动端用户体验:解决输入框被软键盘遮挡的有效方法

解决移动端输入框被软键盘覆盖的问题 在开发移动端网页时&#xff0c;如果页面包含输入框&#xff0c;则可能会遇到输入框被弹出的软键盘遮挡的问题。为了解决这个问题&#xff0c;我们需要理解两种常见的情况以及相应的解决策略。 浏览器未主动聚焦到输入框 现代浏览器和移…...

哈希表(Hashtable)核心知识点详解

1. 基本概念 定义&#xff1a;通过键&#xff08;Key&#xff09;直接访问值&#xff08;Value&#xff09;的数据结构&#xff0c;基于哈希函数将键映射到存储位置。 核心操作&#xff1a; put(key, value)&#xff1a;插入键值对 get(key)&#xff1a;获取键对应的值 remo…...

多分类交叉熵

1. 基本概念&#xff1a;熵与交叉熵 要理解多分类交叉熵损失的由来&#xff0c;首先需要掌握信息论中的两个基础概念&#xff1a;熵&#xff08;Entropy&#xff09;和交叉熵&#xff08;Cross-Entropy&#xff09;。 熵&#xff08;Entropy&#xff09; 熵衡量一个随机变量的…...

【速写】Transformer-encoder-decoder深度解析

文章目录 一、理论分析1. Transformers概述2. Transformer的输入部分具体是如何构成&#xff1f;2.1 单词 Embedding2.2 位置 Embedding 3 自注意力原理3.1 自注意力结构3.2 QKV的计算3.3 自注意力的输出3.4 多头注意力 4 Encoder结构4.1 AddNorm4.2 前馈4.3 组成Encoder 二、代…...

MyBatis八股文-执行流程、延迟加载、一级与二级缓存

(一)执行流程 mybatis-config.xml核心配置文件的作用&#xff1a; 在MyBatis框架的核心配置文件中需要去指定当前的环境配置、指定需要操作的是哪个数据库&#xff0c;并且输入当前的用户名与密码&#xff0c;只有配置了他才能真正操作数据库。同时还去加载了SQL映射文件&#…...

Protobuf 的快速使用(四)

Protobuf 还常⽤于通讯协议、服务端数据交换场景。那么在这个⽰例中&#xff0c;我们将实现⼀个⽹络版本的通讯录&#xff0c;模拟实现客⼾端与服务端的交互&#xff0c;通过 Protobuf 来实现各端之间的协议序列化。需求如下&#xff1a; 客⼾端可以选择对通讯录进⾏以下操作&…...

SQL ServerAlways On 可用性组配置失败

问题现象&#xff1a; 配置 Always On 可用性组时&#xff0c;报错 “无法将数据库加入可用性组”&#xff08;错误 41158&#xff09;&#xff0c;或提示 “WSFC 群集资源无法联机”&#xff08;错误 19471&#xff09;。 快速诊断 验证 WSFC 群集状态&#xff1a; # 检查群集…...

Mysql explain中列的解析

EXPLAIN列的解释&#xff1a; table&#xff1a;显示这一行的数据是关于哪张表的 type&#xff1a;这是重要的列&#xff0c;显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL possible_keys&#xff1a;查询可以利用的索引&#…...

基于Spark的哔哩哔哩舆情数据分析系统

【Spark】基于Spark的哔哩哔哩舆情数据分析系统 &#xff08;完整系统源码开发笔记详细部署教程&#xff09;✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 本项目基于Python和Django框架进行开发&#xff0c;为了便于广大用户针对舆情进行个性化分析处…...

【Linux】日志模块实现详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;博客仓库&#xff1a;https://gitee.com/JohnKingW/linux_test/tree/master/lesson &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &…...

yum list查询时部分包查找不到流程分析

以下是针对 yum list available -c xxx.repo&#xff08;对应 DNF 的命令行操作&#xff09;的详细流程解读&#xff0c;包括参数解析、配置初始化、元数据加载、数据库查询&#xff0c;以及读取不到特定包的场景分析。 1. 命令行参数解析与入口函数 代码入口: dnf.cli.main.m…...

MySQL篇(六)MySQL 分库分表:应对数据增长挑战的有效策略

MySQL篇&#xff08;六&#xff09;MySQL 分库分表&#xff1a;应对数据增长挑战的有效策略 MySQL篇&#xff08;六&#xff09;MySQL 分库分表&#xff1a;应对数据增长挑战的有效策略一、引言二、为什么需要分库分表2.1 性能瓶颈2.2 存储瓶颈2.3 高并发压力 三、分库分表的方…...

Java基础:面向对象高级(四)

内部类&#xff08;类中五大成分之一&#xff09; 四种形式 成员内部类【了解】 静态内部类【了解】 局部内部类【了解】 匿名内部类【重点】 枚举 泛型 什么是泛型 泛型类-模拟ArrayList 泛型接口-操作学生&#xff0c;老师增删改查 泛型方法 泛型擦除和注意事项...

easy-poi 一对多导出

1. 需求&#xff1a; 某一列上下两行单元格A,B值一样且这两个单元格&#xff0c; 前面所有列对应单元格值一样的话&#xff0c; 就对A,B 两个单元格进行纵向合并单元格 1. 核心思路&#xff1a; 先对数据集的国家&#xff0c;省份&#xff0c;城市...... id 身份证进行排序…...

python通过调用海康SDK打开工业相机(全流程)

首先打开海康机器人-机器视觉-下载中心 下载最新版的 MVS 安装后打开目录找到 ...\MVS\Development\Samples\Python 将MvImport内所有文件拷贝至工作目录 然后到 C:\Program Files (x86)\Common Files\MVS\Runtime 找到适合自己系统的版本&#xff0c;将整个文件夹拷贝至工…...

网络安全防御核心原则与实践指南

一、四大核心防御原则 A. 纵深防御原则&#xff08;Defense in Depth&#xff09; 定义&#xff1a;通过在多个层次&#xff08;如网络、系统、应用、数据&#xff09;设置互补的安全措施&#xff0c;形成多层次防护体系。 目的&#xff1a;防止单一漏洞导致整体安全失效&…...

manim,制作专业的数学公式动画

manim是一个Python第三方库,全称是mathematical animation engine(数学动画引擎)。manim用于解说线性代数、微积分、神经网络、黎曼猜想、傅里叶变换以及四元数等数学概念。 manim使你能够以编程的方式创建精确的数学图形、动画和场景。与传统的几何画板等绘图软件不同,man…...

小刚说C语言刷题——第15讲 多分支结构

1.多分支结构 所谓多分支结构是指在选择的时候有多种选择。根据条件满足哪个分支&#xff0c;就走对应分支的语句。 2.语法格式 if(条件1) 语句1; else if(条件2) 语句2; else if(条件3) 语句3; ....... else 语句n; 3.示例代码 从键盘输入三条边的长度&#xff0c;…...

[ctfshow web入门] web6

前置知识 入口点(目录)爆破 还记得之前说过网站的入口的吗&#xff0c;我们输入url/xxx&#xff0c;其中如果url/xxx存在&#xff0c;那么访问成功&#xff0c;证明存在这样一个入口点&#xff1b;如果访问失败则证明不存在此入口点。所以我们可以通过遍历url/xxx&#xff0c;…...

简单程序语言理论与编译技术·22 实现一个从AST到RISCV的编译器

本文是记录专业课“程序语言理论与编译技术”的部分笔记。 LECTURE 22&#xff08;实现一个从AST到RISCV的编译器&#xff09; 一、问题分析 1、完整的编译器&#xff08;如LLVM&#xff09;需先完成AST到IR的转换&#xff0c;并进行代码优化&#xff0c;再到汇编&#xff0…...

Business English Certificates (BEC) 高频词汇学习

Business English Certificates {BEC} 高频词汇 References Cambridge English: Business Certificates, also known as Business English Certificates (BEC), are a suite of three English language qualifications for international business. abandon /əˈbndən/ vt. …...

lua和C的交互

1.C调用lua例子 #include <iostream> #include <lua.hpp>int main() {//用于创建一个新的lua虚拟机lua_State* L luaL_newstate();luaL_openlibs(L);//打开标准库/*if (luaL_dofile(L, "test.lua") ! LUA_OK) {std::cerr << "Lua error: &…...

Css:如何解决绝对定位子元素内容被父级元素overflow:hidden属性剪裁

一、问题描述 今天小伙伴提了一个bug&#xff0c;在点击列表项的“…”按钮应该出现的悬浮菜单显示不完整&#xff1a; 二、问题排查 一般这种问题&#xff0c;是由于悬浮菜单采用的是绝对定位&#xff0c;而父级采用了overflow:hidden属性。但需要注意的是&#xff0c;这里的…...

RoMo: Robust Motion Segmentation Improves Structure from Motion

前言 看起来像是一篇投稿CVPR的文章&#xff0c;不知道被哪个瞎眼审稿人拒了。同期还有一篇CVPR被接收的工作Segment Any Motion in Videos&#xff0c;看起来不如这篇直白&#xff08;也可能是因为我先看过spotlesssplats的缘故&#xff09;&#xff0c;后面也应该一并介绍了…...

MCP 极简入门 - 三分钟 Cline + Smithery 运行 time 服务

文章目录 一、&#x1f680; 初识Smithery&#xff1a;AI服务的新大陆找到心仪的服务 二、Cline 编辑配置文件&#x1f527;1、打开配置文件2. 添加Time Server配置3. 验证配置效果 三、&#x1f4ac; 实战对话&#xff1a;让AI告诉你时间四、服务管理小技巧&#x1f504;&…...

基本机动飞行性能

机动飞行时描述飞机在给定构型和发动机工作状态下改变飞行速度、飞行高度和飞行方向的能力 1. 水平加&#xff08;减&#xff09;速 水平加&#xff08;减&#xff09;速性能反映飞机在水平面内改变直线飞行速度的能力。描述水平加&#xff08;减&#xff09;速性能的参数包括…...

ES6 新特性全面总结

ES6 新特性全面总结 ES6(ECMAScript 2015)是JavaScript语言的重大更新&#xff0c;引入了许多强大的新特性&#xff0c;极大地提升了JavaScript的开发体验和能力。以下是ES6主要新增知识点的详细总结&#xff1a; (一)、ES6变量声明&#xff1a;let 和 const 详解 一、let 和…...