当前位置: 首页 > news >正文

【代码随想录Day47】单调栈Part02

在这里插入图片描述

42. 接雨水

题目链接/文章讲解:代码随想录
视频讲解:单调栈,经典来袭!LeetCode:42.接雨水_哔哩哔哩_bilibili

思路概述

  1. 问题理解:我们需要计算在给定柱子高度之间可以接住的雨水总量。雨水的量取决于柱子的高度和它们之间的相对位置。

  2. 使用栈的数据结构:我们使用栈来存储柱子的索引,以便在遍历时能够快速找到可能的边界柱子。

  3. 遍历柱子:遍历所有柱子。在每一步:

    • 如果当前柱子的高度大于栈顶柱子的高度,意味着我们可以开始计算雨水量。
    • 弹出栈顶索引,得到当前柱子的索引,称为“中间柱子”。
  4. 计算雨水量

    • 检查栈是否为空。如果栈为空,说明没有左边界,无法计算雨水量。
    • 使用栈顶的索引作为左边界,当前柱子的索引作为右边界,计算可以接住的水的高度。
    • 计算水的宽度,即左右边界之间的距离。
  5. 更新总雨水量:将计算得到的雨水量累加到总量中。

  6. 压入当前柱子索引:将当前柱子的索引压入栈中,以便在后续的计算中作为新的边界。

  7. 返回结果:遍历结束后,返回累加的雨水总量。

总结

这种方法利用栈的特性有效地计算了雨水接收量。通过在遍历过程中动态更新栈,能够快速找到左右边界,从而高效地进行雨水量的计算。整体时间复杂度为 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

思路概述

  1. 问题理解
  • 给定一个柱子的高度数组(代表直方图中每个柱子的高度),我们需要找出其中可以形成的最大矩形的面积。
  • 矩形的高度由柱子的高度决定,而宽度则由相邻的柱子决定。
  1. 使用栈来处理柱子
  • 利用栈来存储柱子的索引,以便在遍历过程中能够快速找到较小的柱子,从而确定矩形的高度和宽度。
  • 栈的特点是后进先出(LIFO),适合处理这种需要回溯的场景。
  1. 遍历柱子
  • 通过一次遍历来处理每一个柱子。对于每一个柱子:
    • 如果当前柱子的高度大于栈顶柱子的高度,则可以将当前柱子的索引压入栈中。
    • 如果当前柱子的高度小于等于栈顶柱子的高度,则需要计算以栈顶柱子为最小高度的矩形面积。
  1. 计算矩形面积
  • 当弹出栈顶柱子时,确定以该柱子为最小高度的矩形的高度和宽度:
    • 高度是弹出的柱子的高度。
    • 宽度是当前索引与栈顶索引之间的差值(如果栈为空,说明该柱子是最左边的柱子)。
  • 计算面积并与当前的最大面积进行比较,更新最大面积。
  1. 处理边界情况
  • 在遍历结束后,为了确保栈中所有柱子都能被处理,添加一个高度为0的伪柱。这样可以确保所有剩余的柱子都能计算出相应的面积。
  1. 最终结果
  • 遍历完成后,返回记录的最大矩形面积。

总结:

这个算法的核心在于通过栈的使用来高效地管理柱子的索引,从而在一个线性时间复杂度内计算出最大矩形面积。相比于暴力法(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. 接雨水 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;单调栈&#xff0c;经典来袭&#xff01;LeetCode:42.接雨水_哔哩哔哩_bilibili 思路概述 问题理解&#xff1a;我们需要计算在给定柱子高度之间可以接住的雨水总量。雨水的量取决于柱子的高度和它们…...

Java全栈经典面试题剖析3】JavaSE面向对象2

目录 面试题2.12 Overload和Override的区别 面试题2.13 Overload方法是否可以改变返回值的类型&#xff1f; 面试题2.14 为什么方法不能根据返回类型来区分重载&#xff1f; 面试题2.15 构造器可不可以被重载或重写&#xff1f; 面试题2.16 在 Java 中定义⼀个不做事且没有…...

@JsonIgnoreProperties做接口对接时使用带来的好处

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

SpringBoot整合mybatisPlus实现批量插入并获取ID

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

实战RAG第一天——llama_index向量索引,查询引擎,搜索知识库问答,全部代码,保姆级教学

一、llama_index简介 llama_index(以前称为 GPT Index)是一个用于构建、查询、索引大型文档和数据集的开源框架。它的核心功能是帮助开发者将大语言模型(LLM)与自己的数据集无缝集成,从而进行知识库的构建、查询等任务。llama_index 使用 Python 编写,并结合了多种大语言…...

大数据治理

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

云计算作业

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

复制文件到U盘提示:对于目标文件系统,文件过大

查看U盘属性的文件系统是否为FAT32&#xff0c;需将其改为NTFS 方法一 Win R 输入cmd打开命令行&#xff0c;输入以下命令&#xff08;注&#xff1a;f为U盘盘符&#xff09; convert f: /fs:ntfs /x方法二 格式化U盘&#xff0c;右键点击U盘进行格式化&#xff0c;文件系…...

SpringBoot+Swagger2.7.0实现汉化(2.8.0不行)

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

c++ 散列表

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

Windows通过netsh控制安全中心防火墙和网络保护策略

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

UML(Unified Modeling Language,统一建模语言)

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

深⼊理解指针(2)

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

Ubuntu中MySQL远程登录设置

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

typescript 中封装一个 class 来解析接口响应数据

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

[LeetCode] 21. 合并两个有序链表

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

CTFHUB技能树之SQL——MySQL结构

开启靶场&#xff0c;打开链接&#xff1a; 先判断一下是哪种类型的SQL注入&#xff1a; 1 and 11# 正常回显 1 and 12# 回显错误&#xff0c;说明是整数型注入 判断一下字段数&#xff1a; 1 order by 2# 正常回显 1 order by 3# 回显错误&#xff0c;说明字段数是2列 知道…...

Git小知识:合理的分支命名约定

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

Ubuntu如何显示pcl版本

终端输入&#xff1a; apt-cache show libpcl-dev可以看到&#xff0c;Ubuntu20.04&#xff0c;下载的pcl&#xff0c;应该都是1.10版本的...

wordcloud 字体报错

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

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢&#xff0c;博主的学习进度也是步入了Java Mybatis 框架&#xff0c;目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正确的建议&…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

Vue 模板语句的数据来源

&#x1f9e9; Vue 模板语句的数据来源&#xff1a;全方位解析 Vue 模板&#xff08;<template> 部分&#xff09;中的表达式、指令绑定&#xff08;如 v-bind, v-on&#xff09;和插值&#xff08;{{ }}&#xff09;都在一个特定的作用域内求值。这个作用域由当前 组件…...