【代码随想录Day47】单调栈Part02
42. 接雨水
题目链接/文章讲解:代码随想录
视频讲解:单调栈,经典来袭!LeetCode:42.接雨水_哔哩哔哩_bilibili
思路概述
-
问题理解:我们需要计算在给定柱子高度之间可以接住的雨水总量。雨水的量取决于柱子的高度和它们之间的相对位置。
-
使用栈的数据结构:我们使用栈来存储柱子的索引,以便在遍历时能够快速找到可能的边界柱子。
-
遍历柱子:遍历所有柱子。在每一步:
- 如果当前柱子的高度大于栈顶柱子的高度,意味着我们可以开始计算雨水量。
- 弹出栈顶索引,得到当前柱子的索引,称为“中间柱子”。
-
计算雨水量:
- 检查栈是否为空。如果栈为空,说明没有左边界,无法计算雨水量。
- 使用栈顶的索引作为左边界,当前柱子的索引作为右边界,计算可以接住的水的高度。
- 计算水的宽度,即左右边界之间的距离。
-
更新总雨水量:将计算得到的雨水量累加到总量中。
-
压入当前柱子索引:将当前柱子的索引压入栈中,以便在后续的计算中作为新的边界。
-
返回结果:遍历结束后,返回累加的雨水总量。
总结
这种方法利用栈的特性有效地计算了雨水接收量。通过在遍历过程中动态更新栈,能够快速找到左右边界,从而高效地进行雨水量的计算。整体时间复杂度为 O(n),空间复杂度为 O(n),其中 n 是柱子的数量。
class Solution {public int trap(int[] height) {if (height == null || height.length == 0) {return 0; // 如果输入为空或长度为零,直接返回0}Stack<Integer> stack = new Stack<>();int len = height.length;int sum = 0;for (int i = 0; i < len; i++) {while (!stack.isEmpty() && height[i] > height[stack.peek()]) {int mid = stack.pop(); // 弹出当前的高度if (stack.isEmpty()) {break; // 如果栈空了,说明没有左侧边界,退出循环}// 计算当前可以接到的水的高度int h = Math.min(height[i], height[stack.peek()]) - height[mid];// 计算宽度int w = i - stack.peek() - 1; // 注意宽度应该是两边的边界之间的距离sum += h * w; // 计算并累加总水量}stack.push(i); // 将当前柱子的索引压入栈中}return sum; // 返回总的接水量}
}
84.柱状图中最大的矩形
题目链接/文章讲解:代码随想录
视频讲解:单调栈,又一次经典来袭! LeetCode:84.柱状图中最大的矩形_哔哩哔哩_bilibili
思路概述
- 问题理解:
- 给定一个柱子的高度数组(代表直方图中每个柱子的高度),我们需要找出其中可以形成的最大矩形的面积。
- 矩形的高度由柱子的高度决定,而宽度则由相邻的柱子决定。
- 使用栈来处理柱子:
- 利用栈来存储柱子的索引,以便在遍历过程中能够快速找到较小的柱子,从而确定矩形的高度和宽度。
- 栈的特点是后进先出(LIFO),适合处理这种需要回溯的场景。
- 遍历柱子:
- 通过一次遍历来处理每一个柱子。对于每一个柱子:
- 如果当前柱子的高度大于栈顶柱子的高度,则可以将当前柱子的索引压入栈中。
- 如果当前柱子的高度小于等于栈顶柱子的高度,则需要计算以栈顶柱子为最小高度的矩形面积。
- 计算矩形面积:
- 当弹出栈顶柱子时,确定以该柱子为最小高度的矩形的高度和宽度:
- 高度是弹出的柱子的高度。
- 宽度是当前索引与栈顶索引之间的差值(如果栈为空,说明该柱子是最左边的柱子)。
- 计算面积并与当前的最大面积进行比较,更新最大面积。
- 处理边界情况:
- 在遍历结束后,为了确保栈中所有柱子都能被处理,添加一个高度为0的伪柱。这样可以确保所有剩余的柱子都能计算出相应的面积。
- 最终结果:
- 遍历完成后,返回记录的最大矩形面积。
总结:
这个算法的核心在于通过栈的使用来高效地管理柱子的索引,从而在一个线性时间复杂度内计算出最大矩形面积。相比于暴力法(O(n^2)),这种方法大大提高了效率,适合处理大规模数据。栈的使用使得我们能够在遇到较小柱子时及时计算出可能的矩形面积,同时保持对柱子索引的有效管理。
class Solution {public int largestRectangleArea(int[] heights) {Stack<Integer> stack = new Stack<>(); // 创建一个栈来存储柱子的索引int max = 0; // 初始化最大矩形面积为0int len = heights.length; // 获取柱子数组的长度// 遍历每个柱子,最后一个循环是为了处理栈中的剩余柱子for (int i = 0; i <= len; i++) {// 处理边界情况,添加一个高度为0的伪柱,以确保栈中所有柱子都能被处理int currentHeight = (i == len) ? 0 : heights[i];// 当当前柱子高度小于栈顶柱子的高度时,开始计算面积while (!stack.isEmpty() && currentHeight < heights[stack.peek()]) {int mid = stack.pop(); // 弹出栈顶元素,获取当前柱子的索引int h = heights[mid]; // 获取弹出柱子的高度// 计算矩形的宽度// 如果栈为空,说明mid是最左边的柱子,宽度等于当前索引i// 否则,宽度为当前索引i减去栈顶元素的索引再减去1int w = stack.isEmpty() ? i : i - stack.peek() - 1;// 更新最大矩形面积max = Math.max(max, h * w);}// 将当前柱子的索引入栈stack.push(i);}return max; // 返回计算出的最大矩形面积}
}
相关文章:

【代码随想录Day47】单调栈Part02
42. 接雨水 题目链接/文章讲解:代码随想录 视频讲解:单调栈,经典来袭!LeetCode:42.接雨水_哔哩哔哩_bilibili 思路概述 问题理解:我们需要计算在给定柱子高度之间可以接住的雨水总量。雨水的量取决于柱子的高度和它们…...

Java全栈经典面试题剖析3】JavaSE面向对象2
目录 面试题2.12 Overload和Override的区别 面试题2.13 Overload方法是否可以改变返回值的类型? 面试题2.14 为什么方法不能根据返回类型来区分重载? 面试题2.15 构造器可不可以被重载或重写? 面试题2.16 在 Java 中定义⼀个不做事且没有…...

@JsonIgnoreProperties做接口对接时使用带来的好处
最近看到有个同事,在代码里面加了JsonIgnoreProperties这个注解,以前还真没有经常去用过,接口对接尤其是跟金蝶、用友等第三方,这个注解在接收数据是非常好用的;接下来带大家一起了解下具体的特性和使用方式 JsonIgno…...

SpringBoot整合mybatisPlus实现批量插入并获取ID
背景:需要实现批量插入并且得到插入后的ID。 使用for循环进行insert这里就不说了,在海量数据下其性能是最慢的。数据量小的情况下,没什么区别。 【1】saveBatch(一万条数据总耗时:2478ms) mybatisplus扩展包提供的:…...

实战RAG第一天——llama_index向量索引,查询引擎,搜索知识库问答,全部代码,保姆级教学
一、llama_index简介 llama_index(以前称为 GPT Index)是一个用于构建、查询、索引大型文档和数据集的开源框架。它的核心功能是帮助开发者将大语言模型(LLM)与自己的数据集无缝集成,从而进行知识库的构建、查询等任务。llama_index 使用 Python 编写,并结合了多种大语言…...

大数据治理
大数据治理是指对大数据的管理和控制,以确保数据的质量、可用性、安全性和合规性。随着大数据技术的不断发展,企业和组织面临着越来越多的数据管理挑战,如数据质量问题、数据安全问题、数据合规问题等。大数据治理成为了企业和组织应对这些挑战的重要手段。 一、大数据治理…...

云计算作业
关闭防火墙 停用Linux 挂载 下载nginx程序 启动nginx程序 连接网卡配置文件并且修改 更改模式为静态手动,并且分别修改ip地址,网关地址,dns 激活 创建自定义文件 定义server模块 监听地址 设置目录 匹配 激活网址根目录 创建目录文…...

复制文件到U盘提示:对于目标文件系统,文件过大
查看U盘属性的文件系统是否为FAT32,需将其改为NTFS 方法一 Win R 输入cmd打开命令行,输入以下命令(注:f为U盘盘符) convert f: /fs:ntfs /x方法二 格式化U盘,右键点击U盘进行格式化,文件系…...

SpringBoot+Swagger2.7.0实现汉化(2.8.0不行)
场景 SpringBootSwagger2实现可视化API文档流程: SpringBootSwagger2实现可视化API文档流程_swagger 可视化端口-CSDN博客 上面SpringBoot中使用swagger的效果 上面使用的是swagger2.8.0,且在线API是英文的。现在要将其进行汉化。 汉化效果 实现 首先打开sprin…...

c++ 散列表
散列表(Hash Table)是一种高效的数据结构,广泛用于实现快速的键值对存储。 基本概念 散列表使用哈希函数将键映射到数组的索引。其主要优点在于平均情况下提供常数时间复杂度的查找、插入和删除操作。 哈希函数: 将键映射到一个固定大小的…...

Windows通过netsh控制安全中心防火墙和网络保护策略
Windows通过netsh控制安全中心防火墙和网络保护策略 1. 工具简介 【1】. Windows安全中心 【2】. netsh工具 netsh(Network Shell) 是一个Windows系统本身提供的功能强大的网络配置命令行工具。 2. 开启/关闭防火墙策略 在设置端口(禁用/启用)前&am…...

UML(Unified Modeling Language,统一建模语言)
UML(Unified Modeling Language,统一建模语言)是一种标准化的图形化语言,用于软件工程中的可视化建模。UML由Grady Booch、James Rumbaugh和Ivar Jacobson共同开发,他们各自的工作(Booch方法、OMT方法和OOS…...

深⼊理解指针(2)
目录 1. 数组名的理解 2. 使⽤指针访问数组 3. ⼀维数组传参的本质 4. ⼆级指针 5. 指针数组 6. 指针数组模拟⼆维数组 1. 数组名的理解 我们在使⽤指针访问数组的内容时,有这样的代码: int arr[10] {1,2,3,4,5,6,7,8,9,10}; int *p &arr[…...

Ubuntu中MySQL远程登录设置
mysql单独放在一台Ubuntu服务器上,我远程连接不上。可能是安装的时候忘记设置远程登录了。事后补救措施如下: MySQL 绑定地址配置问题 MySQL 可能只绑定了 localhost,无法接受来自外部主机的连接。你需要检查 MySQL 的配置文件 /etc/mysql/…...

typescript 中封装一个 class 来解析接口响应数据
在TypeScript中,封装一个类来解析接口响应数据是一个常见的做法,它允许你将与接口响应相关的逻辑封装在一个可复用的单元中。下面是一个示例,展示了如何定义一个TypeScript类来解析一个假设的API接口响应数据。 首先,我们定义一个…...

[LeetCode] 21. 合并两个有序链表
题目描述: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4]示例 2: 输入:l1 [], l2 […...

CTFHUB技能树之SQL——MySQL结构
开启靶场,打开链接: 先判断一下是哪种类型的SQL注入: 1 and 11# 正常回显 1 and 12# 回显错误,说明是整数型注入 判断一下字段数: 1 order by 2# 正常回显 1 order by 3# 回显错误,说明字段数是2列 知道…...

Git小知识:合理的分支命名约定
前言:创建新分支时,对 Git 分支进行合理的命名非常重要,应选择有描述性的名称,因为它可以帮助团队成员更好地理解分支的目的和内容,以便将来回顾时能立即明白分支的目的。以下是一些常见的分支命名约定: 功…...

Ubuntu如何显示pcl版本
终端输入: apt-cache show libpcl-dev可以看到,Ubuntu20.04,下载的pcl,应该都是1.10版本的...

wordcloud 字体报错
wordcloud 字体报错 词云库报错:Only supported for TrueType fonts字体文件问题pillow版本的问题wordcloud版本问题(我的最终解决方案) 词云库报错:Only supported for TrueType fonts 字体文件问题 解决方法 写绝对路径 &…...

使用Matplotlib绘制极轴散点图
散点图对于理解数据可视化中变量之间的相互作用至关重要。虽然散点图经常在笛卡尔坐标中创建,但我们也可以使用Matplotlib在极轴上创建散点图。有了这个功能,人们可以以创新的方式查看圆形或角形数据,例如周期性趋势或定向模式。在本文中&…...

Elasticsearch入门:增删改查详解与实用场景
引言 在我之前做社交架构设计的时候,我们有一项关键且必要的需求:需要存储并记录用户的所有聊天记录。这些记录不仅用于业务需求,也承担了风控审查的职责。因此,在架构设计中,我们需要考虑每天海量的聊天消息量&#…...

【AI论文精读6】SELF-RAG(23.10)附录
【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】 P1,P2,P3 附录 A SELF-RAG 细节 A.1 反思标记(reflection tokens) 反思标记的定义 下面我们提供了反思标记类型和输出标记的详细定义。前三个方面将在每个片段…...

sql-labs靶场第十七关测试报告
目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、寻找注入点 2、注入数据库 ①寻找注入方法 ②爆库,查看数据库名称 ③爆表,查看security库的所有表 ④爆列,查看users表的所有列 ⑤成功获取用户名…...

面试官:MySQL一次到底插入多少条数据合适啊?
前言 大家好!在互联网时代,我们的每一个动作,无论是浏览网页、分享动态、点赞、购物或者搜索信息,都会在背后产生数据。这些数据,根据其用途和重要性,可能会被储存到不同的地方,其中最常见的存…...

WSL2 构建Ubuntu系统-轻量级AI运行环境
环境:Win11 软件:WSL2 安装环境:Ubuntu 22.04 检查电脑是否开启虚拟化 打开:任务管理器->性能->CPU CPU 开启虚拟化(通常默认是开启的,如果没有开启需要BIOS开启) 虚拟化设置࿰…...

什么是凸二次规划问题
我们从凸二次规划的基本概念出发,然后解释它与支持向量机的关系。 一、凸二次规划问题的详细介绍 凸二次规划问题是优化问题的一类,目标是最小化一个凸的二次函数,受一组线性约束的限制。凸二次规划是一类特殊的二次规划问题,其…...

解决 Elasticsearch cluster_block_exception 错误的终极指南
Elasticsearch 是一个功能强大的分布式搜索引擎,广泛应用于全文检索、实时分析等场景。 尽管如此,像任何复杂系统一样,它也会遇到一些运行问题,其中较为常见且影响较大的就是 cluster_block_exception 错误。 本文将深入解析这种错…...

QT sql驱动错误QMYSQL driver not loaded
引用文章QMYSQL driver not loaded 根据引用文章,到在编译QT mysql.pro的源码步骤时,构建没有报错,但是在对应的文件夹内没有找到编译好的dll文件,经过全电脑搜寻,找到在此文件夹内。 遇到同样错误的朋友可以找找QT安…...

数据驱动,漫途能耗管理系统打造高效节能新生态!
在我国能源消耗结构中,工业企业所占能耗比例相对较大。为实现碳达峰、碳中和目标,工厂需强化能效管理,减少能耗与成本。高效的能耗管理系统通过数据采集与分析,能实时监控工厂能源使用及报警情况,为节能提供数据。构建…...