lc42接雨水详解

1 42. 接雨水

接雨水

2 推荐阅读的解析

《接雨水》详细通俗的思路分析,多解法

推荐观看方法:二、三和四

3 不懂的地方-方法四的一个判断条件

以下是疑问的地方

height [ left - 1] 是可能成为 max_left 的变量, 同理,height [ right + 1 ] 是可能成为
right_max 的变量。 只要保证 height [ left - 1 ] < height [ right + 1 ] ,那么
max_left 就一定小于 max_right。

对应下面这个代码块:
在这里插入图片描述

4 代码逻辑解析

这个解法的核心思想是双指针法。为了理解这个方法,我们首先要明白一个事实:对于某个柱子来说,它能够接的雨水量取决于它左边的最高柱子和右边的最高柱子中的较小者,减去该柱子的高度。

现在,我们来看这个解法的逻辑:

  1. 初始化两个指针 leftright,分别指向数组的第二个位置和倒数第二个位置。这是因为最左边和最右边的柱子不可能接雨水,所以我们从第二个柱子开始考虑。

  2. 初始化两个变量 max_leftmax_right 来分别记录 left 指针左边的最高柱子和 right 指针右边的最高柱子。

  3. 遍历数组中的每个柱子。对于每个柱子,我们都检查 height[left-1]height[right+1]。这两个值是当前柱子左边和右边的柱子的高度。

  4. 如果 height[left-1] < height[right+1],这意味着 left 指针左边的柱子比 right 指针右边的柱子矮。因此,max_left 有可能被 height[left-1] 更新(如果 height[left-1]max_left 大的话)。

    这里的关键是,由于 height[left-1]height[right+1] 小,所以 max_left 一定小于或等于 max_right。这是因为 max_right 是由 height[right+1] 或更大的值更新的。

  5. 如果 height[left-1] 大于或等于 height[right+1],我们就更新 right 指针和 max_right

  6. 对于每个柱子,我们都计算它能接的雨水量,并将其加到总和中。

这个方法的关键在于,我们每次都移动 leftright 指针中指向较矮柱子的那个。这确保了 max_leftmax_right 总是代表当前柱子左边和右边的最高柱子。

4.1 如果height[left-1] 比 max_left 小的话,怎么保证maxLeft一定小于或等于 max_right?

你提到了一个很好的问题。让我们更深入地探讨这个问题。

首先,我们要明确一点:在每一步中,我们都是在移动leftright中指向较矮柱子的那个。这意味着,如果height[left-1] < height[right+1],那么left指针会向右移动,而right指针不会移动。

现在,考虑以下两种情况:

  1. height[left-1]大于max_left:在这种情况下,max_left会被height[left-1]更新。但是,由于height[left-1]仍然小于height[right+1],所以max_left(即使被更新后)仍然小于或等于max_right

  2. height[left-1]小于或等于max_left:在这种情况下,max_left不会被更新,它的值保持不变。由于之前的步骤已经确保了max_left小于或等于max_right,所以这个关系仍然成立。

因此,无论height[left-1]的值如何,我们都可以确保max_left始终小于或等于max_right,只要height[left-1] < height[right+1]这个条件成立。

这种方法的关键在于,我们始终移动指向较矮柱子的指针,这确保了我们总是在考虑当前柱子左边和右边的最高柱子。

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

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

相关文章

ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的问题解决

winR打开窗口输入 services.msc 停止mysql 找到data文件&#xff0c;清空其中全部文件。没有data文件&#xff0c;手动创建 ​ 输入 mysqld --remove mysql 移除服务&#xff1b; 注册服务&#xff0c;mysqld -install&#xff1b; 并开始初始化&#xff0c;mysqld --initi…

从零开始学习调用百度地图网页API:一、注册百度地图账号

目录 注册账号申请AK 注册账号 https://lbsyun.baidu.com/index.php?titlejspopular3.0/guide/getkey JavaScript API只支持浏览器类型的ak 申请AK 注&#xff1a;使用示例时&#xff0c;需要在百度地图示例加上https:&#xff0c;替换ak。

HashMap 与 HashTable 区别

HashMap HashMap是一个基于 hash 表实现的 K-V 结构的集合。HashMap 是 JDK1.2 引入的一个线程不安全的集合类。 HashMap 内部是采用了数组加链表实现&#xff0c;在 JDK1.8 版本里面做了优化&#xff0c;引入了红黑树。当链表长度大于等于 8 并且数组长度大于 64 的时候&…

PLM、ERP 和 MES,制造业的三剑客

制造业的头号挑战是在合适的周期内、投入合理的成本、获得优秀的产品&#xff0c;信息化和自动化是企业的利器。 除了采用企业资源规划 &#xff08;ERP&#xff09;和制造执行系统 &#xff08;MES&#xff09;来实现制造自动化外&#xff0c;由于产品在到达车间生产制造之前…

凉鞋的 Godot 笔记 109. 专题一 小结

109. 专题一 小结 在这一篇&#xff0c;我们来对第一个专题做一个小的总结。 到目前为止&#xff0c;大家应该能够感受到此教程的基调。 内容的难度非常简单&#xff0c;接近于零基础的程度&#xff0c;不过通过这些零基础内容所介绍的通识内容其实是笔者好多年的时间一点点…

普冉PY32系列(八) GPIO模拟和硬件SPI方式驱动无线收发芯片XN297LBW

目录 普冉PY32系列(一) PY32F0系列32位Cortex M0 MCU简介普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单普冉PY32系列(四) PY32F002A/003/030的时钟设置普冉PY32系列(五) 使用JLink RTT代替串口输出日志普冉PY32…

【算法-贪心】无重叠区间-力扣 435 题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

webpack知识点

什么是webpack webpack是一个模块打包器。通过使用webpack&#xff0c;我们可以将JavaScript文件打包在一起&#xff0c;打包后的文件可以在浏览器中使用 webpack的原理是什么 webpack读取相关配置&#xff0c;根据入口开始便利文件&#xff0c;解析依赖&#xff0c;使用loader…

论文阅读:ECAPA-TDNN

1. 提出ECAPA-TDNN架构 TDNN本质上是1维卷积&#xff0c;而且常常是1维膨胀卷积&#xff0c;这样的一种结构非常注重context&#xff0c;也就是上下文信息&#xff0c;具体而言&#xff0c;是在frame-level的变换中&#xff0c;更多地利用相邻frame的信息&#xff0c;甚至跳过…

windows系统安装openssl并且转换证书格式

概述 碎碎念&#xff0c;如果你有MAC电脑&#xff0c;就别折腾了&#xff0c;直接用MAC电脑吧,不用安装直接用openssl 本文主要讲到了openssl的基本使用方法&#xff0c;开发环境为windows&#xff0c;开发工具为VS2019.本文主要是说明openssl如何使用&#xff0c;不介绍任何理…

11-网络篇-DNS步骤

1.URL URL就是我们常说的网址 https://www.baidu.com/?from1086k https是协议 m.baidu.com是服务器域名 ?from1086k是路径 2.域名 比如https://www.baidu.com 顶级域名.com 二级域名baidu 三级域名www 3.域名解析DNS DNS就是将域名转换成IP的过程 根域名服务器&#xff1a…

【计算机组成体系结构】移码 | 定点小数的表示和运算

一、移码 上篇我们提到了原码&#xff0c;反码和补码的表示形式和如何转换。这篇我们会提到一个新的概念—移码。移码也很简单&#xff0c;其实就是在补码的基础上把符号取反即可。 值得注意的是&#xff0c;移码只能表示整数。而原码&#xff0c;反码和补码既可以表示整数又…

【C++入门】命名空间详解(从零开始,冲击蓝桥杯)

C入门 命名空间 南喵小鸡汤程序员可以让步&#xff0c;却不可以退缩&#xff0c;可以羞涩&#xff0c;却不可以软弱&#xff0c;总之&#xff0c;程序员必须是勇敢的。一 . 命名空间的介绍二.命名空间的实际应用1.为什么要有命名空间我们在使用变量时,通常会为他定义一个名字,在…

pycharm连接gitlab

1、下载安装gitlab 下载地址&#xff1a;Git - Downloading Package 下载后傻瓜式安装&#xff0c;注意勾选配置环境变量 未配置自己配置&#xff0c;电脑-属性-高级系统配置-环境变量 系统变量path&#xff1a;添加git安装目录下bin目录 2、检验安装完成 桌面右键git-open…

物联网AI MicroPython传感器学习 之 TEA5767 FM收音机模块

学物联网&#xff0c;来万物简单IoT物联网&#xff01;&#xff01; 一、产品简介 TEA5767 FM收音机模块是工作频率在76MHz&#xff5e;108MHz的自动数字调谐收音机。其特点高灵敏度、高稳定、低噪声&#xff0c;内部集成了中频选频和解调网络。 引脚定义 GND&#xff1a;接…

组件自定义事件

组件自定义事件是一种组件间通信的方式&#xff0c;适用于&#xff1a;子组件 > 父组件 使用场景 A是父组件&#xff0c;B是子组件&#xff0c;B想给A传数据&#xff0c;那么就要在A中给B绑定自定义事件&#xff08;事件的回调在A中&#xff09;。 绑定自定义事件&#x…

Java对象的比较

目录 PriorityQueue中插入对象 元素的比较 基本类型的比较 对象比较问题 对象的比较 覆写基类的equals 基于Comparble接口类的比较 基于比较器的比较 三种方式的对比 集合框架中PriorityQueue的比较方式 PriorityQueue中插入对象 上一篇博文中我们讲了优先级队列&#…

虚幻引擎:数据表格的C++常用API

1.将数据表格中的所有数据存到一个数组中 //参数1 // 错误提示 //参数2 // 存储的数组 TArray<FKeyInfoHeader*> array; KeyInfoDT->GetAllRows<FKeyInfoHeader>(TEXT("错误"),array); 2.获取表格中所有的行名称 TArray<FName>array; …

golang 拉取 bitbucket.org 私有库

以 bitbucket.org 平台和mac电脑为例 前置条件私库需要给你账号权限&#xff0c;可拉取的权限&#xff0c;否则无法进行正常拉取 我们采用ssh方式&#xff0c;需要在本地生成对应的 rsa 的公钥和私钥&#xff0c;将公钥配置如下图&#xff1a; 在 .ssh/config 写入你的配置 H…

2015架构案例(五十一)

第5题 【说明】某信息技术公司计划开发一套在线投票系统&#xff0c;用于为市场调研、信息调查和销售反馈等业务提供服务。该系统计划通过大量宣传和奖品鼓励的方式快速积累用户&#xff0c;当用户规模扩大到一定程度时&#xff0c;开始联系相关企业提供信息服务&#xff0c;并…