接雨水-热题 100?-Lua 中文代码解题第4题
接雨水-热题 100?-Lua 中文代码解题第4题
给定 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.length1 <= n <= 2 *0 <= height[i] <=
解题思路:
接雨水问题的解决主要依赖于动态规划的思想。这个问题可以理解为求解在一系列柱子中,每根柱子能够存储多少雨水。
1. 初始化:
- 创建两个数组 `left_max` 和 `right_max` 分别记录每根柱子左边和右边的最大高度。
- 对于 `left_max`,初始化时,第一根柱子左边的最大高度就是它自身。
2. 计算左右最大值:
- 从第二根柱子开始,遍历整个柱子序列,对于每一根柱子,其左侧最大高度是它与前一根柱子中的较大者(因为雨水只能被比它高的柱子拦截)。
- 同理,对右侧最大高度进行计算,不过由于我们是从右向左遍历,所以需要倒序遍历,初始值设置为最后一个柱子的高度。
3. 计算并累加雨水量:
- 再次遍历一次柱子序列,对于每一根柱子,它能储存的雨水量等于它的两侧最大高度中的较小值减去它自身的高度。注意,只有当这个差值大于0时,才能储存雨水,否则高度不够无法存储。
4. 返回结果:
- 遍历完成后,累计的雨水总量即为所求的答案。
通过以上步骤,我们可以有效地避免重复计算,并确保找到每根柱子可以储存的最大雨水量,最终得到所有柱子总共能接住的雨水总量。
中文代码 -- 无注释版
函数 合计(水坑高度)如果 #水坑高度 == 0 即返回 0结束局部 n = #水坑高度局部 左边高度 = {水坑高度[1]}因为 i = 2, n 做左边高度[i] = 数.最大值(左边高度[i - 1], 水坑高度[i])结束局部 右边高度 = {}因为 i = n, 1, -1 做右边高度[i] = 数.最大值(右边高度[i + 1] 或 0, 水坑高度[i])结束局部 接水量 = 0因为 i = 1, n 做接水量 = 接水量 + 数.最小值(左边高度[i], 右边高度[i]) - 水坑高度[i]结束返回 接水量
结束-- 示例用法演示:
-- 给定一个表示柱子高度的数组,调用合计函数计算其容纳雨水总量
接雨水 = {0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1}
输出(合计(接雨水))
中文代码 -- 带注释的如下:
-- 根据给定高度数组计算容器内可容纳雨水总量
-- @参数 水坑高度 数组,表示每个位置柱子的高度信息
-- @返回 返回一个整数,表示容器能容纳的雨水总量
函数 合计(水坑高度)-- 若高度数组为空,则直接返回0如果 #水坑高度 == 0 即返回 0结束局部 n = #水坑高度-- 初始化并计算每个位置左侧的最大高度局部 左边高度 = {水坑高度[1]}因为 i = 2, n 做左边高度[i] = 数.最大值(左边高度[i - 1], 水坑高度[i])结束-- 计算每个位置右侧的最大高度局部 右边高度 = {}因为 i = n, 1, -1 做右边高度[i] = 数.最大值(右边高度[i + 1] 或 0, 水坑高度[i])结束-- 计算每个位置形成的凹槽可容纳雨水量,并累加至总水量局部 接水量 = 0因为 i = 1, n 做接水量 = 接水量 + 数.最小值(左边高度[i], 右边高度[i]) - 水坑高度[i]结束返回 接水量
结束
这段代码运行后将会输出:6
我就想问这样子做代码,是不是有点入门水平学生,
相关文章:
接雨水-热题 100?-Lua 中文代码解题第4题
接雨水-热题 100?-Lua 中文代码解题第4题 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释…...
JVM内存溢出排查
JVM内存溢出排查主要涉及到定位问题发生的原因以及确定哪些对象占用了过多的内存。以下是一些排查内存溢出的基本步骤: 查看异常信息: 当JVM发生内存溢出时,会抛出OutOfMemoryError异常,并伴随异常信息。这些信息可以帮助初步定位…...
Leetcode 200. 岛屿数量
心路历程: 在没有看图论这一章之前看这道题没什么直接的思路,在看完图论之后,学着使用DFS和BFS去套用解决。第一次自己做的时候还是遇到了很多小问题。整体思路很流畅,但是需要处理的细节第一次没怎么处理好,花了很多…...
多线程基础 -概念、创建、等待、分离、终止
文章目录 一、 线程概念1. 什么是线程2. 线程的优点3.线程的缺点4. 线程异常5. 线程用途 二、 Linux进程VS线程1. 进程和线程2. 进程和线程的地址空间3. 进程和线程的关系 三、Linux线程控制1. POSIX线程库2. 线程创建3. 线程ID及进程地址空间布局4. 线程终止5. 线程等待6. 线程…...
【Vue3】走进Pinia,学习Pinia,使用Pinia
💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…...
【TB作品】430单片机,单片机串口多功能通信,Proteus仿真
文章目录 题目功能仿真图程序介绍代码、仿真、原理图、PCB 题目 60、单片机串口多功能通信 基本要求: 设计一串口通信程序,波特率38400,通过RS232与PC机通信。 自动循环发送数据串(设计在程序中) 接收并存储和显示该数据串 在发送端定义10个ASCII码键0-9 按键发送单字节,PC机接…...
【C++ leetcode】双指针问题
1. 611. 有效三角形的个数 题目 给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。 题目链接 . - 力扣(LeetCode) 画图 和 文字 分析 判断是否是三角形要得到三边,由于遍历三边要套三层循环&#x…...
Kubernetes集群部署
1.集群环境搭建 1.1 环境规划 kubernetes集群大体上分为两类:一主多从和多主多从。 一主多从:一台Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境多主多从:多台Master节点和多…...
深拷贝与浅拷贝
深拷贝与浅拷贝是在进行对象复制时常见的两种方式,这两个概念其实比较混淆,面试中也经常出现,但是实际开发很少用到,所以本文就来详细讲解一下,让大家不再迷惑。 浅拷贝只是复制了对象的引用(地址…...
golang学习网址
.1LearnKu 终身编程者的知识社区 https://learnku.com/...
2024学习鸿蒙开发,未来发展如何?
一、前言 想要了解一个领域的未来发展如何,可以从如下几点进行,避免盲从: 国家政策落地情况就业市场如何学习 通过上述三点,就能分析出一个行业的趋势。大家可以看到,我上面的总体逻辑就是根据国家政策来分析未来方…...
3.21Code
基于二叉链表的二叉树最大宽度的计算 #include<iostream>#define MAXSIZE 1000using namespace std;int k0; int m0; //记录层数 typedef struct BiNode{char data;struct BiNode *lchild;struct BiNode *rchild; }BiNode,*BiTree;void CreateBiTree(BiTree &T){cha…...
学习总结2
解题思路 用bfs进行搜索,标记A罐B罐所保存的水的出现情况,当再次出现的时候停止搜索,然后用数组模拟链表进行保存路径.最后输出. 代码 #include <iostream> #include <cstdio> #include <fstream> #include <algorithm> #include <cmath> #in…...
【LeetCode】--- 动态规划 集训(一)
目录 一、1137. 第 N 个泰波那契数1.1 题目解析1.2 状态转移方程1.3 解题代码 二、面试题 08.01. 三步问题2.1 题目解析2.2 状态转移方程2.3 解题代码 三、746. 使用最小花费爬楼梯3.1 题目解析3.2 状态转移方程3.3 解题代码 一、1137. 第 N 个泰波那契数 题目地址:…...
【数据结构与算法】(18):树形选择排序:按照锦标赛的思想进行排序
🤡博客主页:Code_文晓 🥰本文专栏:数据结构与算法 😻欢迎关注:感谢大家的点赞评论关注,祝您学有所成! ✨✨💜💛想要学习更多数据结构与算法点击专栏链接查看&…...
统计单词数
统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。 现在,请你编程实现这一功能,具体要求是:给定一个单词࿰…...
c++pair的用法
pair简单来说就是可以存储两种类型数据的一个类,其内部是使用模板实现的,所以可以指定其内部的类型。 pair在#include <utility> pair的构造 pair<int, string> p1({ 1,"张三" });pair<int, string> p2;pair<int, str…...
石油炼化5G智能制造工厂数字孪生可视化平台,推进行业数字化转型
石油炼化5G智能制造工厂数字孪生可视化平台,推进行业数字化转型。在石油炼化行业,5G智能制造工厂数字孪生可视化平台的出现,为行业的数字化转型注入了新的活力。石油炼化行业作为传统工业的重要领域,面临着资源紧张、环境压力、安…...
IP代理技术革新:探索数据采集的新路径
引言: 随着全球化进程不断加深,网络数据采集在企业决策和市场分析中扮演着愈发重要的角色。然而,地域限制和IP封锁等问题常常给数据采集工作带来了巨大挑战。亿牛云代理服务凭借其强大的网络覆盖和真实住宅IP资源,成为解决这些问…...
流畅的 Python 第二版(GPT 重译)(一)
前言 计划是这样的:当有人使用你不理解的特性时,直接开枪打死他们。这比学习新东西要容易得多,不久之后,活下来的程序员只会用一个容易理解的、微小的 Python 0.9.6 子集来编写代码 。 Tim Peters,传奇的核心开发者&am…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
