lc42接雨水详解

news2024/11/25 20:36:00

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.coloradmin.cn/o/1093164.html

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

相关文章

隧道代理-

文章目录 代理代理使用场景VPS建立隧道frpMSF木马生成监听开启frp服务端和客户端执行exe木马文件 代理 实验环境&#xff1a; 攻击机kali&#xff1a;192.168.160.32&#xff08;NAT模式&#xff09;模拟的公网服务器&#xff08;本机&#xff09;&#xff1a;10.9.75.214失陷…

SQL Server远程登录失败

SQL Server远程登录失败 检查SQL SERVER 是否允许远程访问. 具体步骤: 1)在远端SQL Server主机上,打开SSMS并连接数据库 2)在相应”数据库”上单击右键,选择”属性” 3)选择”连接”选项卡,检查”远程服务器连接”下,RPC服务是否选择. 设置SQL Server相关TCP连接 1.打开SQL Se…

代码随想录算法训练营第天十六天丨 二叉树part04

文档讲解&#xff1a;代码随想录 状态&#xff1a;已完成 513.找树左下角的值 思路 递归 分析一下题目&#xff1a;在树的最后一行找到最左边的值。 首先要是最后一行&#xff0c;然后是最左边的值。 如果使用递归法&#xff0c;如何判断是最后一行呢&#xff0c;其实就是…

为数据列表的每条记录生成对应的二维码

效果图&#xff1a; 一、前端 <!DOCTYPE html> <html lang"zh" xmlns:th"http://www.thymeleaf.org" xmlns:shiro"http://www.pollix.at/thymeleaf/shiro"> <head><th:block th:include"include :: header(固定资产…

CA与区块链之数字签名详解

CA与区块链验证本质上都是数字签名&#xff0c;首先&#xff0c;我们看一下什么是数字签名&#xff01; 数字签名 数字签名是公钥密码学中的一种技术&#xff0c;用于验证信息的完整性和发送者的身份。简而言之&#xff0c;数字签名是一种确认信息来源和信息完整性的手段。它通…

沉睡的木乃伊:var_export() 与可解析字符串

文章目录 参考环境var_export()概念应用场景数据持久化调试 函数 var_export() 自定义类__set_state() 魔术方法设置 __set_state 魔术方法的逻辑以复原对象注意事项 通用内置空类 stdClassstdClass对 __set_state() 的天然支持 参考 项目描述搜索引擎Bing、GoogleAI 大模型文…

UI自动化测试 —— Jenkins配置

前一段时间帮助团队搭建了UI自动化环境&#xff0c;这里将Jenkins环境的一些配置分享给大家。 背景&#xff1a; 团队下半年的目标之一是实现自动化测试&#xff0c;这里要吐槽一下&#xff0c;之前开发的测试平台了&#xff0c;最初的目的是用来做接口自动化测试和性能测试&…

数睿通2.0:高效的数据处理,主数据与数据表功能全面升级

引言 八天很短&#xff0c;七天很长&#xff0c;数睿通 2.0 数据中台也随之迎来了新一轮的版本迭代&#xff0c;本次更新主要包括&#xff1a; 主数据模型&#xff08;可视化建模&#xff09;主数据派发&#xff08;支持派发主数据到下游数据表&#xff0c;rabbitMq&#xff…

字节码学习之常见java语句的底层原理

文章目录 前言1. if语句字节码的解析 2. for循环字节码的解析 3. while循环4. switch语句5. try-catch语句6. i 和i的字节码7. try-catch-finally8. 参考文档 前言 上一章我们聊了《JVM字节码指令详解》 。本章我们学以致用&#xff0c;聊一下我们常见的一些java语句的特性底层…

苍穹外卖(四) AOP切面公共字段自动填充及文件上传

一.AOP切面公共字段填充 问题分析 如果都按照上述的操作方式来处理这些公共字段, 需要在每一个业务方法中进行操作, 编码相对冗余、繁琐&#xff0c;那能不能对于这些公共字段在某个地方统一处理&#xff0c;来简化开发呢&#xff1f; 答案是可以的&#xff0c;我们使用AOP切…

Redis订阅和发布

Redis订阅和发布 一、订阅者和发布者二、使用示例三、常用命令 一、订阅者和发布者 发布者&#xff1a;publish&#xff0c;发送消息订阅者&#xff1a;subscribe&#xff0c;接收消息 如下图所示&#xff0c;可以有多个订阅者订阅同一个频道&#xff0c;如果该频道发送消息&…

【RocketMQ系列一】初识RocketMQ

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

thinkphp6入门(9)-- 获取url路径中的应用名、控制器名、操作名

如果使用了多应用模式&#xff0c;可以通过下面的方法来获取当前应用 app(http)->getName(); 获取当前控制器 Request::controller(); 获取当前操作 Request::action(); 在中间件middleware中是无法获取控制器和操作的 需要将middleware的引入修改为 config 目录下的 ro…

计算机网络 实验六 Wireshark 抓包实验

实验目的&#xff1a; 通过实验掌握下列知识&#xff1a; 1. 掌握Wireshark抓包工具的使用。 2. 掌握建立telnet用户密码登录方式&#xff0c;并通过wireshark抓取相关信息。 3. 理解TCP的包结构&#xff0c;并掌握TCP建立连接的过程。 4. 掌握使用tftp工具&#xff0c;上…

一文带你了解以色列的当红38家网络安全公司

2014年&#xff0c;以色列出口的网络安全产品总值达60亿美金&#xff0c;占领了全球10%的网络安全市场。2014-2016年&#xff0c;微软用3.2亿美元买下数据隐私公司Adallom&#xff1b;Facebook花了1.5亿美元收购移动端数据分析公司Onavo&#xff1b;PayPal以6千万美元收下CyAct…

2023面试知识点二

1、vue双向绑定是如何实现的 原理主要通过数据劫持和发布订阅模式实现的通过Object.defineProperty()来劫持各个属性的setter&#xff0c;getter&#xff0c;监听数据的变化在数据变动时发布消息给订阅者(watcher)&#xff0c;订阅者触发响应的回调(update)更新视图。 2、ing…

非一线工程管理者的一对一沟通

一线工程管理者主要管理/领导工程师完成实际的工程任务&#xff0c;而非一线的工程管理者需要领导一线管理者&#xff0c;更多的关注团队本身&#xff0c;因此两者在做一对一沟通的时候需要有不同的关注点。原文: One-on-Ones for (Engineering) Manager of Managers 如果没有耐…

Linux该如何学习,给你支招

如果你已经确定对 Linux 产生了兴趣&#xff0c;那么接下来我们介绍一下学习 Linux 的方法。这只是自己关于学习Linux的建议。 一、如何去学习 学习大多类似庖丁解牛&#xff0c;对事物的认识一般都是由浅入深、由表及里的过程&#xff0c;循序才能渐进。学习 Linux 同样要有一…

复旦MBA魏文童:构建完备管理知识体系,助力企业数字化发展

日月光华&#xff0c;旦复旦兮&#xff01;复旦MBA如同一个巨大的磁场&#xff0c;吸引了诸多来自五湖四海、各行各业的职场精英。从初入职场的青涩懵懂到如今的独当一面专业干练&#xff0c;他们逐渐成长为职场的中坚力量&#xff0c;在各自领域内发光发热。作为新时代的青年&…

怒刷LeetCode的第27天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;位运算 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;贪心算法 第三题 题目来源 题目内容 解决方法 方法一&#xff1a;二分查找 方法二&#xff1a;牛顿迭代法 方法三&#xff1a;位操作…