题目描述

给定 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,是左边所有柱子高度的最大值,这个木板高度为什么取左边最大值?显然,左边最高的木板能挡住更多的水,如果左边最高的木板离当前柱子比较远,那接水的面积可能更大。同理右边木板最大高度是右边所有柱子中高度最大的。现在确定了当前水桶(柱子)的左右木板高度,那么实际水桶的接水量就取决于两个木板最短的那个减去当前柱子的高度,即 water[i]=Min(leftSide,rightSide)−height[i]water[i] = Min(leftSide, rightSide) - height[i]water[i]=Min(leftSide,rightSide)height[i]。上图中的红色部分接水量 w=Math.min(2,3)−1=1w = Math.min(2, 3) - 1 = 1w=Math.min(2,3)1=1。定义两个数组 leftMaxrightMax 用于分别存储每个柱子左右木板的最大值,初始化 leftMax = height[0], rightMax = height[height.length-1],分别正序遍历和倒序遍历数组更新leftMax[i]rightMax[i],每次遍历的高度与数组存储的之前最大高度比较取最大值,这是动态规划思想。最后遍历高度数组 height,根据预处理的当前柱子左右木板高度和当前柱子高度很容易计算当前柱子的接水量,累加所有柱子接水量就是整个题目的答案。

算法过程

  1. 初始化两个数组 leftMaxrightMax,分别用于存储每个位置左侧和右侧的最大高度
  2. 正序遍历高度数组,计算 leftMax[i]:每个位置左侧的最大高度(包含当前位置)
  3. 倒序遍历高度数组,计算 rightMax[i]:每个位置右侧的最大高度(包含当前位置)
  4. 遍历每个位置,计算该位置可接水量:Math.min(leftMax[i], rightMax[i]) - height[i]
  5. 累加所有位置的接水量,得到总接水量并返回,时间复杂度O(n)O(n)O(n),空间复杂度O(n)O(n)O(n)

代码

/*** @param {number[]} height* @return {number}*/
var trap = function(height) {const len = height.length;const leftMax = new Array(height

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

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

相关文章

短剧小程序系统开发:构建影视娱乐新生态的基石

在移动互联网的浪潮中&#xff0c;影视娱乐行业正经历着深刻的变革。短剧&#xff0c;作为一种新兴的内容形式&#xff0c;以其独特的魅力和广泛的受众基础&#xff0c;成为了行业发展的新亮点。而短剧小程序系统开发&#xff0c;则是构建影视娱乐新生态的基石&#xff0c;为行…

基于Pytochvideo训练自己的的视频分类模型

视频分类模型简介 ​X3D 系列模型 官方网站 https://github.com/facebookresearch/SlowFast ​提出论文​ Facebook Research 的《X3D: Expanding Architectures for Efficient Video Recognition》 https://arxiv.org/pdf/2004.04730 原理 X3D 的设计思路受到机器学习中…

LidaRefer-v2论文速读

研究背景 研究背景 3D视觉定位&#xff08;3D Visual Grounding, VG&#xff09;是一项旨在根据自然语言描述&#xff0c;在三维场景中精确定位出相应物体或区域的任务 。这项技术在人机交互领域至关重要&#xff0c;尤其是在自动驾驶、机器人技术和AR/VR等应用中&#xff0c;它…

逻辑移位与算术移位

根本的区别在于&#xff1a;它们如何对待符号位&#xff08;最高位&#xff09;。 一、逻辑移位 (Logical Shift) 无论左移、右移&#xff0c;空出的位永远用 0 填充。主要针对无符号整数、快速乘除2的幂。 二、算术移位 (Arithmetic Shift) 左移用 0 填充、右移用符号位填充。…

内存对齐的使用和禁用

在 C 语言和 C 中&#xff0c;__attribute__((packed)) 是一种用于数据结构体的编译器扩展属性&#xff0c;这个属性主要用于修改结构体的内存对齐行为。背景知识&#xff1a;结构体内存对齐在许多计算机架构中&#xff0c;编译器会自动对数据进行对齐&#xff08;alignment&am…

SpringBoot3后端项目介绍:mybig-event

mybig-event 项目简介 mybig-event 是一个基于 Spring Boot 的事件管理系统&#xff0c;提供用户管理、文章发布、分类管理、文件上传等功能&#xff0c;采用现代化的 Java 技术栈构建&#xff0c;支持高效开发和部署。 仓库链接&#xff1a;https://github.com/foorgange/mybi…

week3-[分支嵌套]方阵

week3-[分支嵌套]方阵 题目描述 有 nmn\times mnm 个人站成 nnn 行 mmm 列的方阵。我们想知道第 xxx 行 yyy 列的人的某个方向有没有人。 输入格式 输入共 222 行。 第 111 行输入 444 个正整数 n,m,x,yn,m,x,yn,m,x,y。 第 222 行输入 111 个字符为 U、D、L、R 其中之一&#…

深入理解C++ std::shared_ptr:现代C++内存管理的艺术与实践

在C++的发展历程中,内存管理始终是开发者面临的核心挑战。从C语言继承而来的手动内存管理方式,虽然提供了极大的灵活性,却也成为无数程序错误的根源。内存泄漏、悬空指针、双重释放等问题长期困扰着C++开发者,直到智能指针的出现改变了这一局面。作为C++11标准引入的重要特…

一个 WPF 文档和工具窗口布局容器

一个 WPF 文档和工具窗口布局容器、用于排列文档 和工具窗口的方式与许多知名 IDE 类似&#xff0c;例如 Eclipse、Visual Studio、 PhotoShop 等等 AvalonDock 是一个 WPF 文档和工具窗口布局容器&#xff0c;用于排列文档 和工具窗口的方式与许多知名 IDE 类似&#xff0c;例…

【qml-5】qml与c++交互(类型单例)

背景&#xff1a; 【qml-1】qml与c交互第一次尝试&#xff08;实例注入&#xff09; 【qml-2】尝试一个有模式的qml弹窗 【qml-3】qml与c交互第二次尝试&#xff08;类型注册&#xff09; 【qml-4】qml与c交互&#xff08;类型多例&#xff09; 【qml-5】qml与c交互&#…

循环神经网络(RNN)、LSTM 与 GRU (一)

循环神经网络&#xff08;RNN&#xff09;、LSTM 与 GRU &#xff08;一&#xff09; 文章目录循环神经网络&#xff08;RNN&#xff09;、LSTM 与 GRU &#xff08;一&#xff09;循环神经网络&#xff08;RNN&#xff09;、LSTM 与 GRU一、RNN&#xff08;Recurrent Neural N…

【AAOS】Android Automotive 16模拟器源码下载及编译

源码下载repo init -u https://android.googlesource.com/platform/manifest -b android-16.0.0_r2 repo sync -c --no-tags --no-clone-bundle源码编译source build/envsetup.sh lunch sdk_car_x86_64-bp2a-eng make -j8运行效果emualtorHomeAll appsSettingsHAVCNotification…

jvm三色标记

好的&#xff0c;咱们把专业概念和生活例子结合起来&#xff0c;一步一步说清楚三色标记法&#xff1a;一、核心概念&#xff1a;用“颜色”给对象贴“状态标签”就像给家里的物品贴标签&#xff0c;每种颜色代表它在“垃圾回收&#xff08;大扫除&#xff09;”中的状态&#…

生成式AI的能力边界与职业重构:从“百科实习生“到人机协作增强器

根据微软最新研究&#xff0c;基于20万条Copilot使用数据及用户反馈&#xff0c;研究者揭示了生成式AI在实际应用中的能力边界与职业影响。数据显示&#xff0c;用户使用AI助手最频繁的任务是信息获取&#xff08;占比近40%&#xff09;&#xff0c;其次是公众沟通类工作&#…

java17学习笔记

Java17是一个重要的特性发布&#xff0c;也是比较常用的一个版本&#xff0c;根据 2024Java生态统计&#xff0c;Java 17、11 和 8 的用户比例分别为 35%、33% 和 29%。它遵循了自Java10以来引入的Java发布步调&#xff0c;并于2021年 9 月 14 日发布&#xff0c;在Java16发布后…

【AI应用】修改向量数据库Milvus默认密码

说明&#xff1a; 1&#xff09;部署向量数据库milvus运行一段时间后&#xff0c;想开启密码认证登录attu页面 2&#xff09;开启密码认证登录&#xff0c;提示用户和密码不正确&#xff0c;因为默认密码已存储在物理机 3&#xff09;通过attu管理页面修改向量数据库milvus默认…

分布式系统消息队列:可靠投递与延时消息实战

在分布式系统架构中&#xff0c;消息队列&#xff08;MQ&#xff09;作为解耦服务、削峰填谷、异步通信的核心组件&#xff0c;其消息投递的可靠性与延时消息的精准性直接影响业务系统的稳定性。本文结合实际业务场景&#xff0c;详细解析消息投递的全流程设计与延时消息的通用…

Java 学习笔记(基础篇6)

面向对象基础1. 类和对象(1) 示例&#xff1a;public class Student {String name "张三";int age 23;public void study() {System.out.println("学习 Java");}public void eat() {System.out.println("吃饭");} }public class Test {public …

光学件加工厂倚光科技:陪跑光学未来力量

在光学创新的漫漫长路上&#xff0c;总有一些看似 “不划算” 的坚持&#xff0c;却在悄然改写行业的未来。倚光科技的故事&#xff0c;就始于这样一种选择 —— 明知光学打样利润微薄&#xff0c;明知上百个项目中能走到量产的寥寥无几&#xff0c;仍愿意投入全球顶尖的设备与…

RabbitMQ:生产者可靠性(生产者重连、生产者确认)

目录一、生产者重连二、生产者确认一、生产者重连 当网络不稳定的时候&#xff0c;利用重试机制可以有效提高消息发送的成功率。不过SpringAMQP提供的重试机制是阻塞式的重试&#xff0c;也就是说多次重试过程中&#xff0c;当前线程是被阻塞的&#xff0c;会影响业务性能。 …