柱状图中最大的矩形 - LeetCode 热题 73

大家好!我是曾续缘😛

今天是《LeetCode 热题 100》系列

发车第 73 天

栈第 5 题

❤️点赞 👍 收藏 ⭐再看,养成习惯

柱状图中最大的矩形

给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

 

示例 1:

输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10

示例 2:

输入: heights = [2,4]
输出: 4

 

提示:

  • 1 <= heights.length <=105
  • 0 <= heights[i] <= 104
难度:💝💝💝

解题方法

我们要求的是在一个由数字组成的柱状图中,能够找到的最大矩形的面积。这个矩形可以是水平也可以是垂直的。

首先,我们需要知道每个柱子左右两边第一个比它矮的柱子的位置。这样我们才能确定一个柱子能构成的所有可能的矩形。

如何找到柱子两边第一个比它矮的柱子位置呢?

我们利用单调栈找到每个柱子的左边界和右边界,将其存储在数组 lr 中。

维护一个严格单调递增的栈,

  • 当一个柱子可以入栈时,说明栈顶元素就是就是左边第一个比它矮的柱子位置。
  • 当入了栈的柱子被当前柱子排出栈时,说明当前柱子是排出栈的柱子的第一个小于等于它的柱子,也就找到了排出栈柱子的右边第一个不比它高的柱子位置(因为有可能相等)。
  • 使用右边不比它高的柱子来计算答案时不一定是最大的面积,但可以保证高度相等的最右侧柱子的答案是最大的。

得到数组 lr 后,我们遍历每个柱子,用它的高度乘以它左右两边第一个比它矮的柱子之间的距离,这样就能得到以当前柱子为高的所有可能的矩形的面积。

最后,我们只需要在这些面积中找到最大的一个即可。

Code

class Solution {// 寻找每个柱子左右两边第一个比它矮的柱子的位置public int largestRectangleArea(int[] heights) {int n = heights.length;int[] l = new int[n], r = new int[n];Arrays.fill(r, n);Stack<Integer> stack = new Stack<Integer>();for(int i = 0; i < n; i++){// 当栈不为空,并且栈顶的柱子高度大于等于当前柱子的高度时while(!stack.isEmpty() && heights[stack.peek()] >= heights[i]){// 弹出栈顶元素,更新右边界r[stack.pop()] = i;}// 如果栈为空,则当前柱子左边第一个比它矮的柱子是-1,否则就是栈顶元素l[i] = stack.isEmpty() ? -1 : stack.peek();// 把当前柱子压入栈stack.push(i);}int ans = 0;// 遍历每个柱子,计算以它为高的所有可能的矩形的面积for(int i = 0; i < n; i++){ans = Math.max(ans, heights[i] * (r[i] - l[i] - 1));}// 返回最大的矩形面积return ans;}
}

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

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

相关文章

MyBatis实用方案,如何使项目兼容多种数据库

系列文章目录 MyBatis缓存原理 Mybatis plugin 的使用及原理 MyBatisSpringboot 启动到SQL执行全流程 数据库操作不再困难&#xff0c;MyBatis动态Sql标签解析 Mybatis的CachingExecutor与二级缓存 使用MybatisPlus还是MyBaits &#xff0c;开发者应该如何选择&#xff1f; 巧…

Unity Mirror 从入门到入神(三)

文章目录 Unity Mirror 从入门到入神&#xff08;三&#xff09;NetworkManagerModeStartHostSetupServer NetworkServerListenRegisterMessageHandlersOnCommandMessage RemoteCall.csCommandRequiresAuthority NetworkIdentityHandleRemoteCall RemoteCall.csInvokeRegisterC…

【问题处理】maven一直提示artemis-http-client-1.1.8.jar报错(2024-05-25)

项目使用了视频监控&#xff0c;里面涉及到海康威视的视频监控。 问题&#xff1a; pom在导入maven时&#xff0c;报错“Could not find artifact com.artemis:http-client:jar:1.1.8 ” 原因&#xff1a; 根据平台提供的maven地址&#xff0c;填写进pom文件中&#xff0c;编…

汇编-16位汇编环境搭建

16位汇编环境 在学习16位汇编时&#xff0c;我选择的环境是在VMware中安装Windows XP虚拟机来学习&#xff1b;因为Windows XP提供了兼容的DOS环境&#xff0c;可以直接运行和调试16位汇编程序&#xff1b;在win10&#xff0c;win11环境中原生不支持直接运行 16 位程序&#x…

房地产画册制作成手机在线翻页效果

​随着科技的飞速发展&#xff0c;移动互联网已经深入到人们的日常生活中。在这个数字化的时代&#xff0c;房地产行业也紧跟潮流&#xff0c;将画册制作成手机在线翻页效果&#xff0c;以满足消费者的阅读习惯。 房地产画册制作成手机在线翻页效果&#xff0c;不仅能够满足消费…

抖音商品API接口:开启电商自动化和数据洞察之门

在数字化转型的浪潮中&#xff0c;电商平台如抖音正通过其商品API接口&#xff0c;为商家和开发者提供了深入理解和利用电商数据的新途径。本篇文章将引导读者了解抖音商品API接口的基本概念、使用方法&#xff0c;并提供一个简单的代码示例&#xff0c;以教育和启发对电商自动…

mac清理软件推荐免费 mac清理系统数据怎么清理 cleanmymac和腾讯柠檬哪个好

macbook是苹果公司的一款高性能的笔记本电脑&#xff0c;受到了很多用户的喜爱。但是&#xff0c;随着使用时间的增长&#xff0c;macbook的系统也会积累一些垃圾文件&#xff0c;影响其运行速度和空间。那么&#xff0c;macbook系统清理软件推荐有哪些呢&#xff1f;macbook用…

263 基于matlab得到的频分复用(FDM,Frequency Division Multiplexing)实现

基于matlab得到的频分复用(FDM&#xff0c;Frequency Division Multiplexing)实现&#xff0c;仿真时录入三路声音信号进行处理&#xff0c;将用于传输信道的总带宽划分成三个子频带&#xff0c;经过复用以后再将录入的声音信号恢复出来。程序已调通&#xff0c;可直接运行。 2…

Docker | 基础指令

环境&#xff1a;centos8 参考&#xff1a; 安装 Docker | Docker 从入门到实践https://vuepress.mirror.docker-practice.com/install/ 安装Docker 卸载旧版本&#xff0c;安装依赖包&#xff0c;添加yum软件源&#xff0c;更新 yum 软件源缓存&#xff0c;安装 docker-ce…

AI助力农田作物智能化激光除草,基于轻量级YOLOv8n开发构建农田作物场景下常见20种杂草检测识别分析系统

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术在各个领域的应用愈发广泛&#xff0c;其中农业领域也不例外。近年来&#xff0c;AI助力农田作物场景下智能激光除草的技术成为了农业领域的一大亮点&#xff0c;它代表着农业智能化、自动化的新趋势。智…

OAuth2.0

OAuth2.0 OAuth2.0是一种授权框架&#xff0c;用于授权第三方应用访问用户资源的方式。它允许用户将自己的信息&#xff08;如照片、视频等&#xff09;存储在一个服务提供商中&#xff0c;然后授权第三方应用访问这些信息&#xff0c;而无需提供用户名和密码给第三方应用。OAu…

基于地理坐标的高阶几何编辑工具算法(1)——目录

文章目录 背景目录效果相交面裁剪相离面吸附线分割面合并相交面合并相离面矩形绘制整形面 背景 在实际的地图编辑平台中&#xff0c;有一些场景是需要对几何面做修形操作&#xff0c;低效的做法是通过新增形点拖拽来实现。为了提高面几何的编辑效率&#xff0c;需要提供一些便…

公安数据库身份核验、C++便于集成的身份证实名认证接口开发文档

在当今数字化时代&#xff0c;信息安全与身份认证的精确性是企业发展的生命线。面对复杂多变的网络环境&#xff0c;如何高效、安全地完成用户身份核验&#xff0c;成为了每个企业的必修课。翔云提供了公安数据库身份核验接口&#xff0c;专为有需要的企业实现实名认证功能的无…

Java开发大厂面试第23讲:说一下 JVM 的内存布局和运行原理?

JVM&#xff08;Java Virtual Machine&#xff0c;Java 虚拟机&#xff09;顾名思义就是用来执行 Java 程序的“虚拟主机”&#xff0c;实际的工作是将编译的 class 代码&#xff08;字节码&#xff09;翻译成底层操作系统可以运行的机器码并且进行调用执行&#xff0c;这也是 …

虹科案例丨VLAN不再难懂:一台转换器+交换机轻松解锁VLAN配置

来源&#xff1a;虹科汽车电子 虹科案例丨VLAN不再难懂&#xff1a;一台转换器交换机轻松解锁VLAN配置 原文链接&#xff1a;https://mp.weixin.qq.com/s/5cFLWniozlppQGD7RcvgxA 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; #VLAN #转换器 #交换机 导读 还在为…

顺序表-线性表的顺序表示

线性表 顺序表-线性表的顺序表示 #include <stdio.h>// 顺序表的大小 #define MaxSize 50 // 数据类型 typedef int ElemType; // 静态分配 // 此处可以不用给结构体起名称 使用时直接用别名即可 typedef struct {// 数组ElemType data[MaxSize];// 当前顺序表中元素个…

【Numpy】深入解析numpy中的ravel方法

NumPy中的ravel方法&#xff1a;一维化数组的艺术 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393; 博主简…

实现复杂树结构返回(不含子树), 并且结点间建立关联

&#x1f4a1; 一句话结&#xff1a; 实现传感器和深度及采集的数值动态对应&#xff0c;将不规则的数据转变成固定列头的一行行数据。 &#x1f511; 关键信息点&#xff1a; 通过传感器编号和深度将传感器对应的数值与时间建立关联。使用SpringBootMyBatis框架实现动态查询…

RSA算法加解密

RSA算法的加密过程如下&#xff1a; 选择两个大素数①p和q&#xff0c;计算它们的乘积np*q计算欧拉函数φ(n)(p-1)*(q-1)选择一个整数e&#xff0c;满足1<e<φ(n)&#xff0c;且e与φ(n)互质计算e关于φ(n)的模逆元d&#xff0c;即满足e*d mod φ(n) 1的整数d②公钥为(…

【设计模式深度剖析】【2】【结构型】【装饰器模式】| 以去咖啡馆买咖啡为例 | 以穿衣服出门类比

&#x1f448;️上一篇:代理模式 目 录 装饰器模式定义英文原话直译如何理解呢&#xff1f;4个角色类图1. 抽象构件&#xff08;Component&#xff09;角色2. 具体构件&#xff08;Concrete Component&#xff09;角色3. 装饰&#xff08;Decorator&#xff09;角色4. 具体装饰…