【算法】接雨水

难度:困难

题目

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

解题思路:

这道题目的核心是求解一个数组中,可以储存多少单位的雨水。想象一下,每个数组元素代表一块宽度为1的柱子高度,雨水会在柱子之间累积。我们要找到所有柱子间的凹陷部分可以储存的雨水总量。

  1. 初始化:设置两个指针left和right分别指向数组的开始和结束位置,同时初始化两个变量maxLeft和maxRight来跟踪左右两边的最大高度。
  2. 循环条件:当left < right时,进入循环。
  3. 更新最大高度:在每一步中,比较当前left和right位置的柱子高度与它们各自方向上的最大高度,更新maxLeft和maxRight。因为雨水的高度受限于两边的最低高度,所以我们只需要关注限制雨水高度的那一边。
  4. 计算并累加雨水:对于当前位置,雨水的高度是由Math.min(maxLeft, maxRight)决定的,减去当前柱子的高度,就是这部分可以储存的雨水量。累加这部分雨水到总雨水中。
  5. 移动指针:根据maxLeft和maxRight的大小关系,移动高度较小的那一侧的指针。因为那一侧的柱子高度限制了雨水的高度,移动它可以探索是否有更大的空间储存雨水。
  6. 重复步骤3-5,直到left >= right。
  7. 返回结果:最后返回累加的雨水总量。

JavaScript实现:

function trap(height) {let left = 0, right = height.length - 1;let maxLeft = 0, maxRight = 0;let totalRainwater = 0;while (left < right) {if (height[left] <= height[right]) {// 左侧柱子矮或者相等时,更新左侧最大高度并移动left指针maxLeft = Math.max(maxLeft, height[left]);totalRainwater += maxLeft - height[left];left++;} else {// 右侧柱子矮时,更新右侧最大高度并移动right指针maxRight = Math.max(maxRight, height[right]);totalRainwater += maxRight - height[right];right--;}}return totalRainwater;
}// 示例
//console.log(trap([0,1,0,2,1,0,1,3,2,1,2,1])); // 输出: 6

使用双指针法解决“计算柱子间雨水量”问题的原因主要在于其高效性和直观性,具体优势如下:

  1. 效率高:双指针法允许我们在一次遍历中解决问题,只需两个指针分别从数组的两端开始向中间移动,时间复杂度为O(n),其中n为柱子的数量。相比于其他可能需要多次遍历或使用额外空间的算法,双指针法更加高效。
  2. 减少空间复杂度:此方法不需要额外的大空间来存储信息,除了几个变量外,几乎不需要额外的空间开销,因此空间复杂度为O(1),非常节省内存。
  3. 直观易懂:双指针策略直观地模拟了从数组两端向中心逐步逼近的过程,容易理解。通过比较左右两侧的最大高度并移动较矮一侧的指针,可以直观地看到如何逐步累加雨水量。
  4. 自动去重:在处理连续相同高度的柱子时,双指针法可以自然地跳过这些柱子,避免了重复计算。例如,当一个指针向内移动时,如果当前柱子高度小于或等于最大高度,直接计算差值并移动指针,不会重复考虑相同高度的柱子。
  5. 灵活性:双指针法可以适应多种变体问题,比如如果问题变为计算两边高度不同时的雨水量,只需稍作调整即可,体现了算法的灵活性。

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

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

相关文章

使用AI学习英语

使用AI学英语可以通过与智能AI对话、模拟对话场景、提供即时反馈和个性化学习计划等方式提高学习效率和效果。然而&#xff0c;AI技术也存在局限性&#xff0c;如缺乏情感交流和真实语境&#xff0c;需要与真人教师结合使用。 AI学英语的基本原理和应用 AI的基本原理 AI&…

【chatgpt消费者偏好】是什么驱动了游客持续旅游意愿?推文分享—2024-07-08

今天推文的主题是【chatgpt&消费者意愿】 第一篇&#xff1a;文章主要研究了什么因素驱动旅游者继续使用ChatGPT进行旅行服务&#xff0c;并从人类拟态的角度探讨了旅游者对ChatGPT的感知和使用意图。第二篇&#xff1a;本文探讨了ChatGPT-4在生成针对TripAdvisor上发布的…

Python入门 2024/7/8 序列切片,set

目录 小知识 数据容器&#xff08;序列&#xff09;的切片 切片 语法 倒序取(步长为负数的情况下) 小练习 暴力方法 优雅方法 数据容器 set集合 特点 基本语法 定义集合字面量 定义集合变量 定义空集合 基础操作 添加新元素 移除元素 随机取一个元素 清空集…

【教学类-66-01】20240708通义万象下载的图片增加文件名

背景需求&#xff1a; 前期&#xff0c;通义万象下载的图片都是用“XX_XX”的数字表示 今天我下载了建筑&#xff0c;如果文件名只有数字&#xff0c;根本不知道它是什么建筑。 找到RPA读取的50个建筑的XCLX文件 第1个生成的是“”埃菲尔铁塔”&#xff0c;下载时&#xff0c;…

layui-表格

1.使用方法 加上table标签 加上classlayui-table colgroup是列属性 tr是行td是列 thead是表头&#xff0c;后面一一对应 2.基础属性 加lay-even逐行换色 加lay-skin 设置边框风格

数学系C++ 继承派生多态 (十四十三)

— 继承 可以使得派生类具有父类的各种属性和功能&#xff0c;而不需要再次编写相同的代码。 类的继承&#xff1a;派生类继承了父类的特性&#xff08;数据和函数&#xff09; ► 继承是可传递的&#xff1a;从父类继承的特性可以传递给新的子类 ► 继承方式&#xff1a;规…

成长过程,摔倒不要紧,爬起来、改过、前进

无论何时何地&#xff0c;我们都有重头再来的能力&#xff0c;这份生生不息的力量来自天之灵根&#xff1b; 学习过程会有跌倒&#xff0c;这是很正常的节奏次序&#xff0c;不能掩盖自己的过失、自欺欺人&#xff0c;这不是过失&#xff0c;摔倒了就拍拍身上的灰尘&#xff…

2-28 基于matlab提取出频域和时域信号的29个特征

基于matlab提取出频域和时域信号的29个特征&#xff0c;主运行文件feature_extraction&#xff0c;fre_statistical_compute和time_statistical_compute分别提取频域和时域的特征&#xff0c;生成的29个特征保存在生成的feature矩阵中。程序已调通&#xff0c;可直接运行。 2-2…

为什么要学习Go?

目录 前言 一、Go 语言的发展史 Robert Griesemer Rob Pike Ken Thompson 二、Go语言全面分析 主要优势 主要挑战 三、Go 语言最佳实践 1. 云原生开发 2. 网络服务开发 3. 系统工具和实用程序 4. 数据处理和分析 四、哪些知名公司使用 Go 语言&#xff1f; Google …

这几类人,千万不要买纯电车

文 | AUTO芯球 作者 | 响铃 纯电车的冤大头真是太多了&#xff0c; 我之前劝过&#xff0c;有些人不适合买纯电车&#xff0c; 你们看&#xff0c;果然吧&#xff0c;麦卡锡最近的一份报告就披露了 去年啊&#xff0c;22%的人在买了电车后后悔了&#xff0c; 这些人说了&a…

PCL 点云FPFH特征描述子

点云FPFH特征描述子 一、概述1.1 FPFH概念1.2 基本原理1.3 PFH和FPFH的区别二、代码实现三、结果示例一、概述 1.1 FPFH概念 快速点特征直方图(FPFH)描述子:计算 PFH 特征的效率其实是十分低的,这样的算法复杂度无法实现实时或接近实时的应用。因此,这篇文章将介绍 PFH 的简…

C++规范

一、VS工具集列表&#xff1a; Visual Studio 2008&#xff1a;v90 Visual Studio 2010&#xff1a;v100 Visual Studio 2012&#xff1a;v110 Visual Studio 2013&#xff1a;v120 Visual Studio 2015&#xff1a;v140 &#xff08;v140_xp&#xff09; Visual Studio 2017&a…

鸿蒙开发HarmonyOS NEXT (三) 熟悉ArkTs (上)

一、自定义组件 1、自定义组件 自定义组件&#xff0c;最基础的结构如下&#xff1a; Component struct Header {build() {} } 提取头部标题部分的代码&#xff0c;写成自定义组件。 1、新建ArkTs文件&#xff0c;把Header内容写好。 2、在需要用到的地方&#xff0c;导入…

【Linux】进程间通信——匿名管道

为什么要进行进程间通信&#xff1f; 1.数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程&#xff0c;比如我们有两个进程&#xff0c;一个负责获取数据&#xff0c;另一个负责处理数据&#xff0c;这时第一个进程就要将获取到的数据交给第二个进程 2.资源共享&…

虚拟机使用

1、安装 如何安装虚拟机&#xff1f;保姆级安装教程&#xff01; - 知乎 (zhihu.com) 2、使用 2.1 快照 作用&#xff1a;保留当前系统信息为快照&#xff0c;随时可以恢复&#xff0c;以防未来系统被你玩坏&#xff0c;就好比游戏中的归档&#xff01;每配置好一个就可以保…

CANopen协议---PDO使用配置

1、CANopen知识回顾 在上一讲中&#xff0c;已经对CANopen的基本结构和整体内容进行了一番梳理&#xff0c;本笔记主要整理了一下CANopen如何配置PDO&#xff0c;实现数据周期性自动上传和控制信号快速发送等操作。 CANopen协议开发梳理总结笔记教程-CSDN博客文章浏览阅读920次…

代码随想录-Day53

739. 每日温度 给定一个整数数组 temperatures &#xff0c;表示每天的温度&#xff0c;返回一个数组 answer &#xff0c;其中 answer[i] 是指对于第 i 天&#xff0c;下一个更高温度出现在几天后。如果气温在这之后都不会升高&#xff0c;请在该位置用 0 来代替。 示例 1: …

微信视频号及直播回放下载工具

最近需要下载微信视频号中的视频&#xff0c;找一圈&#xff0c;终于找到了&#xff0c;&#xff0c;免费&#xff0c;没广告 软件叫做&#xff1a;爱享素材下载器。 是一款开源的、完全免费的工具。 第1步&#xff1a;下载安装包 下载地址&#xff1a; https://github.com/p…

年销量超1亿箱,三得利BOSS咖啡如何凭借人群战略打造极致产品力?

BOSS咖啡诞生于1992年&#xff0c;在可口可乐、朝日、麒麟等饮料巨头先后入局&#xff0c;市场竞争非常激烈的情况下&#xff0c;BOSS咖啡成为受国民欢迎的品牌&#xff0c;它是如何做到的呢? 罐装咖啡趋势崛起&#xff0c;各大品牌推出罐装咖啡 自1980年代起&#xff0c;罐装…

猫咪浮毛多怎么办?一分钟推荐性价比高的养猫空气净化器排名

作为一名猫咖店老板&#xff0c;我发现很多铲屎官来店里咨询&#xff0c;在春夏换季时会频繁打喷嚏、全身过敏红肿。这是因为猫咪在换季时会大量掉毛&#xff0c;家里就像下雪一样&#xff0c;空气中充满了猫毛。这些猫毛上附带的细菌会随浮毛被人吸入&#xff0c;从而引发打喷…