【代码随想录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;  // 返回计算出的最大矩形面积}
}

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

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

相关文章

PP-ChatOCRv3—文档场景信息抽取v3产线使用教程

文档场景信息抽取v3产线使用教程 1. 文档场景信息抽取v3产线介绍 文档场景信息抽取v3&#xff08;PP-ChatOCRv3&#xff09;是飞桨特色的文档和图像智能分析解决方案&#xff0c;结合了 LLM 和 OCR 技术&#xff0c;一站式解决版面分析、生僻字、多页 pdf、表格、印章识别等常…

有同学问:拿到大厂JAVA OFFER,但是会不会不稳定,有失业风险?!

昨天在直播里面有一个同学说拿到了大厂的offer&#xff0c;但是最近看了很多很多的报道&#xff0c;说大厂Java会不会也失业&#xff1f; 前两天也有家长私信咨询说孩子去了外企&#xff0c;拿着23K的工资&#xff0c;会不会也不稳定&#xff1f; 现在很多同学看了新闻报道或…

热门解压短视频素材资源网站推荐

解压短视频素材哪里找&#xff1f;今天我们来盘点一些优质的解压短视频素材下载平台。如果你也在寻找热门解压视频素材&#xff0c;这份资源清单一定能帮到你&#xff5e; 蛙学网 蛙学网是国内领先的视频素材网站&#xff0c;涵盖了各种类型的解压视频资源&#xff0c;如手艺制…

【专题】计算机网络之物理层

计算机网络体系结构&#xff1a; 1. 物理层的基本概念 物理层考虑的是怎样才能在连接各种计算机的传输媒体上传输数据比特流&#xff0c;而不是指具体的传输媒体。 作用&#xff1a;尽可能屏蔽掉不同传输媒体和通信手段的差异。 用于物理层的协议也常称为物理层规程 (procedu…

【HarmonyOS NEXT】实现保存base64图片到图库

上篇文章介绍了HarmonyOS NEXT如何保存base64文件到download目录下&#xff0c;本次介绍如何保存base64图片到图库&#xff0c;网络图片保存方式大同小异&#xff0c;先下载图片&#xff0c;然后再保存 phAccessHelper.showAssetsCreationDialog参考官方文档’ ohos.file.pho…

利用透视变换实现文档矫正功能

透视变换是将成像投影到一个新的平面上&#xff0c;也称作投影映射。OpenCV通过函数cv2.getPerspectiveTransorm(pos1,pos2)构造矩阵M&#xff0c;其中pos1和pos2分别表示变换前后4个点的对应位置。得到M后再通过函数cv2.warpPerspective(src,M,(cols,rows))进行透视变换。 函数…

Threejs 实现3D 地图(02)创建3d 地图

"d3": "^7.9.0", "three": "^0.169.0", "vue": "^3.5.10" 地图数据来源&#xff1a; DataV.GeoAtlas地理小工具系列 <script setup> import {onMounted, ref} from vue import * as THREE from three im…

空间单细胞转录组cell2location分析流程学习

Cell2location 是一个用于空间转录组学数据分析的工具。它是一个基于贝叶斯统计模型的Python包&#xff0c;旨在利用空间转录组数据和单细胞转录组数据来进行细胞类型的空间解构。通过将单细胞转录组数据中的细胞类型信息投射到空间转录组数据中&#xff0c;Cell2location 可以…

如何应对 Android 面试官 -> ANR 如何优化?线上 ANR 如何监控?

前言 本章主要围绕 ANR 如何监控以及优化&#xff1b; 基本概念 ANR(Android Not Responding) 是指应用程序未响应&#xff0c;Android 系统对于一些事件需要在一定的时间范围内完成&#xff0c;如果超过预订时间未能得到有效响应或者响应时间过长&#xff0c;都会造成 ANR。 …

SAP_MM模块-设置业务合作伙伴类型字段必输(多种方案)

一、业务背景 公司需要把供应商增加一个细分的维度&#xff0c;并且要求该字段设置为必输&#xff0c;防止用户新增供应商时忘记维护。这里给用户找了一个分类的字段&#xff1a;业务合作伙伴类型&#xff0c;本文主要讲解如何设置该字段设置为必填&#xff1b; 注意&#xff…

[笔记] 关于CreateProcessWithLogonW函数创建进程

函数介绍 https://learn.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-createprocesswithlogonw BOOL CreateProcessWithLogonW([in] LPCWSTR lpUsername,[in, optional] LPCWSTR lpDomain,[in] …

【MySQL】表的约束、基本查询、内置函数

目录 1. 表的约束1.1 空属性1.2 默认值1.3 列描述1.4 zerofill1.5 主键1.6 自增长1.7 唯一键1.8 外键 2. 基本查询2.1 表的增删改查2.1.1 插入数据2.1.2 插入否则更新2.1.3 替换插入 2.2 Retrieve2.2.1 select ----- 查询2.2.2 where ----- 筛选2.2.3 order by ----- 结果排序2…

C++11——基础新增特性

目录 C11介绍统一的列表初始化对内置类型initializer_list 声明autodecltypenullptr 范围for容器新增接口emplace容器的新方法 C的前身是“C with Classes”&#xff0c; 最早于 1979年由 祖师爷Bjarne Stroustrup&#xff08;本贾尼斯特劳斯特鲁普&#xff09; 在贝尔实验室…

#HarmonyOS:页面和自定义组件生命周期

页面生命周期 即被Entry装饰的组件生命周期 onPageShow&#xff1a;页面每次显示时触发一次&#xff0c;包括路由过程、应用进入前台等场景。onPageHide: 页面每次隐藏时触发一次&#xff0c;包括路由过程、应用进入后台等场景。onBackPress: 当用户点击返回按钮是触发 组件…

成都睿明智科技有限公司解锁抖音电商新蓝海

在这个短视频风靡的时代&#xff0c;抖音已不仅仅是一个娱乐平台&#xff0c;它更是商家们竞相追逐的电商新战场。成都睿明智科技有限公司&#xff0c;作为抖音电商服务领域的佼佼者&#xff0c;正以敏锐的洞察力和专业的服务&#xff0c;助力众多品牌在这片蓝海中乘风破浪&…

RHCE-多IP访问网站

关闭防火墙 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0下载nginx工具 [rootlocalhost ~]# yum install nginx Updating Subscription Management repositories. Unable to read consumer identityThis system is not registered with an …

面对AI算力需求激增,如何守护数据中心机房安全?

随着人工智能&#xff08;AI&#xff09;技术飞速发展&#xff0c;AI算力需求呈现爆发式增长&#xff0c;导致对数据设备电力的需求指数级攀升。这给数据中心带来前所未有的挑战和机遇&#xff0c;从提供稳定的电力供应、优化高密度的部署&#xff0c;到数据安全的隐私保护&…

【unity小技巧】Unity6 LTS版本安装和一些修改和新功能使用介绍

文章目录 前言安装新功能变化1、官方推荐使用inputsystem进行输入控制2、修复了InputSystem命名错误导致listen被遮挡的bug3、自带去除unity启动画面logo功能4、unity官方的behavior行为树插件5、linearVelocity代替过时的velocity方法待续 完结 前言 2024/10/17其实unity就已…

前端拦截302重定向

背景: 根据业务场景需要拦截302做后续的逻辑处理 尝试一: : axios拦截 、、、、、async created() {// 获取302请求返回的location后手动修改video的src路径let targetSrc;try {await axios.get(this.video).then((res) > {const { headers, status } res;const { locat…

Spring Cloud 解决了哪些问题?

大家好&#xff0c;我是锋哥。今天分享关于【Spring Cloud 解决了哪些问题&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; Spring Cloud 解决了哪些问题&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Spring Cloud 是一个为构建分布式…