柱状图中最大的矩形-java

news2025/1/31 11:30:52
  • 题目描述(力扣题库 84):

    • 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。

    •   

  • 解题思想: 

    • 单调栈:

    • 利用先进后出的思想, 先算出长度更高的柱子所能勾勒出的矩形的面积.
      • 我们从左到右遍历给定的直方图数组, 与此同时, 使用一个单调递增的栈来存储直方图柱子的索引。这样,栈顶元素对应的柱子高度始终是递增的。

      • 当我们遇到一个柱子高度小于栈顶柱子高度时,说明找到了一个可以计算矩形面积的位置。这是因为在单调递增栈中,栈顶元素右侧第一个小于自身高度的柱子就是该柱子右边界。因此,我们弹出栈顶元素,计算以该柱子高度为矩形高度的最大矩形面积。矩形的宽度可以通过当前位置索引与栈顶元素索引之差来确定。

      • 重复之前步骤直到栈为空或者当前柱子高度大于栈顶柱子高度。这个步骤保证了栈内的柱子高度始终是单调递增的,且找到了所有可以计算矩形面积的位置。

    • 其中最为关键的是, 得到柱子所能渲染的矩形的宽度

    • 解题步骤: 

      • 1.初始化变量和数据结构
        • 初始化一个整数变量 area 用于保存最大面积。
        • 初始化一个双端队列 stack 用于保存直方图中柱子的索引。
      • 2.遍历直方图
        • 使用 for 循环遍历直方图中的每个柱子。
      • 3.维护单调递增栈
        • 在循环中,每次都会检查当前柱子的高度是否小于栈顶柱子的高度,如果是,则说明栈顶柱子的右边界可以确定,可以计算以栈顶柱子为高度的最大矩形面积。在这个过程中,不断地从栈中弹出柱子,直到当前柱子的高度不小于栈顶柱子的高度,或者栈为空。
        • 弹出柱子时,计算以弹出柱子的高度为高度的矩形面积。计算面积的方法是通过弹出柱子的索引和当前柱子的索引来计算宽度,即 width = i - stack.peekLast() - 1
        • 每次计算完矩形面积后,更新 area 的值为当前面积和历史最大面积中的较大值。
      • 4.处理剩余的柱子
        • 遍历完成后,如果栈中还有柱子,说明这些柱子的右边界是整个直方图的末尾,因此可以以这些柱子为高度计算最大矩形面积。这部分的处理与上面的过程类似。
      • 5.返回最大面积
        • 返回最大面积 area
      • 这个算法的关键思想是使用单调递增栈来找到每个柱子的左右边界,从而计算以每个柱子为高度的最大矩形面积,然后从中选出最大值

    • 以下是代码实现:

      • class Solution {
            public int largestRectangleArea(int[] heights){
                if(heights.length == 0) return 0;
                if(heights.length == 1) return heights[0];
        
                int area = 0;
                Deque<Integer> stack = new ArrayDeque<>();
                for (int i = 0; i < heights.length; i++) {
                    while(!stack.isEmpty() && heights[stack.peekLast()] > heights[i]){
                        int height = heights[stack.removeLast()];
        
                        int width;
                        if(stack.isEmpty()) width = i;
                        else width = i - stack.peekLast() - 1;
        
                        area = Math.max(area, height * width);
                    }
        
                    stack.addLast(i);
                }
                while(!stack.isEmpty()){
                    int height = heights[stack.removeLast()];
        
                    int width;
                    if(stack.isEmpty()) width = heights.length;
                    else width = heights.length - stack.peekLast() - 1;
        
                    area = Math.max(area, height * width);
                }
                return area;
            }
        }

          

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

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

相关文章

echarts可视化大屏入门

效果图&#xff1a; index.less: //css 初始化 * {margin:0;padding:0;box-sizing:border-box; } .box{width:1rem;height:1rem;background-color:pink } li{list-style:none;//消除数字前的圆点 } //声明字体 font-face{font-family:electronicFONT;src:url(../font/DS-DIGIT…

在家也能赚钱!长期副业兼职,充分利用你的零碎时间!

2024年已然匆匆走过了三分之一&#xff0c;许多人或许都感受到了这一年大环境带来的压力。然而&#xff0c;对我而言&#xff0c;每个月的副业收入尚算可观&#xff0c;稳定在3000元以上&#xff0c;这让我深感庆幸&#xff0c;因为我找到了那份适合自己的副业。 打工的日子&a…

Matlab应用层生成简述

基础软件层 目前接触到的几款控制器&#xff0c;其厂商并没有提供simulink的基础软件库一般为底层文件被封装为lib&#xff0c;留有供调用API接口虽然能根据API接口开发基础软件库&#xff0c;但耗费时间过长得不偿失 应用层 所以可以将应用层封装为一个子系统&#xff0c;其…

6轮面试辛苦拿到阿里Android开发offer,却从22k降到15k,在逗我?(2)

一般来说我会这样建议别人写简历&#xff1a; 全文杜绝任何的精通字眼&#xff0c;如果你真的精通&#xff0c;不需要投简历找工作了。 简历控制在两页左右&#xff0c;不需要找什么简历模板&#xff0c;直接 Markdown 生成 PDF 文件&#xff0c;面试官不在意你的简历有多好看…

【MacBook系统homebrew镜像记录】

安装 使用Homebrew 国内源安装脚本,贼方便&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"切换至清华大学镜像源&#xff1a; 命令合并&#xff1a; 分别切换了 brew.git、 homebrew-core.git、 homebrew-…

docker安装jenkins 2024版

docker 指令安装安装 docker run -d --restartalways \ --name jenkins -uroot -p 10340:8080 \ -p 10341:50000 \ -v /home/docker/jenkins:/var/jenkins_home \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /usr/bin/docker:/usr/bin/docker jenkins/jenkins:lts访问…

sharo反序列化漏洞

启动docker 服务 sudo service docker start 打开靶场 sudo docker run -d -p 80:8080 medicean/vulapps:s_shiro_1 输入docker虚拟机地址打开靶机sharo框架 如何利用漏洞 打开工具目录在终端中打开 输入靶机地址 打开yaki监听端口可以设置为6666 返回工具填写靶机ip和端口 …

树莓派5使用体验

原文地址&#xff1a;树莓派5使用体验 - Pleasure的博客 下面是正文内容&#xff1a; 前言 好久没有关于教程方面的博文了&#xff0c;由于最近打算入门嵌入式系统&#xff0c;所以就去购入了树莓派5开发板 树莓派5是2023年10月23日正式发售的&#xff0c;过去的时间不算太远吧…

【前沿模型解析】潜在扩散模型 2-1 | 手撕感知图像压缩 基础块ResNet块

文章目录 1 残差结构回顾2 LDM结构中的残差结构设计2.1 组归一化GroupNorm层2.2 激活函数层2.3 卷积层2.4 dropout层 3 代码实现 1 残差结构回顾 残差结构应该是非常重要的基础块之一了&#xff0c;你肯定会在各种各样的网络模型结构里看到残差结构&#xff0c;他是非常强大的…

【绘图案例-模拟ImageView Objective-C语言】

一、接下来,我们来模拟一下imageView, 1.我们先来写一段儿简单的代码,然后我们再来说怎么着去做啊, 首先呢,imageView啊,它初始化,有两个方法: 1)init: 2)initWithImage: 这两个方法,有什么样儿的区别呢,知道吗,除了默认带不带图片以外,还有没有其他的区别…

C语言进阶课程学习记录-第25课 - # 和 ## 操作符使用分析

C语言进阶课程学习记录-第25课 - # 和 ## 操作符使用分析 #运算符实验-#转化字符串预处理后代码 实验-#输出函数名预处理后的代码 ##运算符实验-##定义变量预处理后代码 实验-##定义结构体预处理后的代码 小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图…

linux基础篇:linux挂载本地yum源——centos7.9为例

linux挂载本地yum源——centos7.9为例 一、Linux本地yum源介绍 Linux本地YUM源是一个本地存储的软件包仓库&#xff0c;它允许用户在不连接互联网的情况下安装、更新和管理软件包。本地YUM源可以提高软件包安装速度&#xff0c;降低网络带宽消耗&#xff0c;并提高软件包管理…

C语言程序与设计——指针地址与main函数

指针变量 在C语言中&#xff0c;最重要的就是对于指针和地址的理解&#xff0c;因为C语言是更接近底层的编程语言&#xff0c;所以它可以允许开发者对内存操作&#xff0c;这也是区别于其它编程语言的一个重要特性。 如何对内存进行操作呢。我们知道在编程过程中&#xff0c;在…

软件设计师:11-结构化开发与UML

结构化开发&#xff08;3-4分&#xff09; 一、模块化 二、耦合&#xff08;背&#xff09; 三、内聚&#xff08;背&#xff09; 四、设计原则&#xff08;背&#xff09; 五、系统文档 六、数据流图 数据流的起点或终点必须有一个是加工 判断依据&#xff1a; 1、…

CTF之GET和POST

学过php都知道就一个简单传参&#xff0c;构造payload:?whatflag得到 flag{3121064b1e9e27280f9f709144222429} 下面是POST那题 使用firefox浏览器的插件Hackbar勾选POST传入whatflag flag{828a91acc006990d74b0cb0c2f62b8d8}

【TI毫米波雷达】官方工业雷达包的生命体征检测环境配置及避坑(Vital_Signs、IWR6843AOPEVM)

【TI毫米波雷达】官方工业雷达包的生命体征检测环境配置及避坑&#xff08;Vital_Signs、IWR6843AOPEVM&#xff09; 文章目录 生命体征基本介绍IWR6843AOPEVM的配置上位机配置文件避坑上位机start测试距离检测心跳检测呼吸频率检测空环境测试 附录&#xff1a;结构框架雷达基…

js,uniapp,vue,小写数字转化为大写

应用场景&#xff1a; 把1、2、3&#xff0c;转为一、二、三 方法&#xff1a; retBigSrt(num) {const changeNum [零, 一, 二, 三, 四, 五, 六, 七, 八, 九]const unit [, 十, 百]num parseInt(num)const getWan (temp) > {const strArr temp.toString().split().re…

Github项目推荐-ChatGPT-Admin-Web

项目地址 https://github.com/AprilNEA/ChatGPT-Admin-Web 项目简介 通过api接入大模型&#xff0c;并基于此封装了一层用户管理的功能&#xff0c;适合团队内使用。 项目截图

瑞吉外卖实战学习-17、用户地址簿相关功能

用户地址簿相关功能 效果图1、根据规则创建相关文件2、新增收货地址接口3、列表查询页面以及设置默认地址 效果图 1、根据规则创建相关文件 2、新增收货地址接口 获取到传入的数据然后将id添加进去&#xff0c;然后存储到数据库 3、列表查询页面以及设置默认地址 list接口&am…

C顺序表:通讯录

目录 前言 通讯录数据结构 通讯录初始化 查找名字 增加联系人 删除联系人 展示所有联系人 查找联系人 修改信息 销毁通讯录 完整通讯录代码 前言 数据结构中的顺序表如果已经学会了&#xff0c;那么我们就可以基于顺序表来完成一个通讯录了 通讯录其实我们使用前…