柱状图中最大的矩形-java

  • 题目描述(力扣题库 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;
            }
        }

          

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

jdk目录结构

jdk目录详解 JDK(Java Development Kit&#xff0c;Java开发包&#xff0c;Java开发工具)是一个写Java的applet和应用程序的程序开发环境。它由一个处于操作系统层之上的运行环境还有开发者 编译&#xff0c;调试和运行用Java语言写的applet和应用程序所需的工具组成。 JDK(J…

以动态库链接库 .dll 探索结构体参数

Dev c C语言实现第一个 dll 动态链接库 创建与调用-CSDN博客 在写dll 插件中发现的函数指针用途和 typedef 的定义指针的用法-CSDN博客 两步之后&#xff0c;尝试加入结构体实现整体数据使用。 注意结构体 Ak 是相同的 代码如下 DLL文件有两个&#xff0c;dll.dll是上面提到…

揭开“栈和队列”的神秘面纱

前言 在线性表中不止有顺序表和链表&#xff0c;今天的主角就如标题所说--->认识栈和队列。把他们俩放一起总结是有原因的&#xff0c;还请看官听我娓娓道来~ 什么是栈&#xff1f; 栈&#xff08;stack&#xff09;是限定仅在表尾进行插入和删除操作的线性表 咱可以把栈理…

qt自定义窗口在拖动过程中出现抖动且拖动后位置看上去不对

自定义窗口拖动 引言开发环境关键性代码运行结果原因分析改进代码运行结果globalPos()globalPosition()再次修改代码运行结果区别 引言 本文旨在一个问题的记录&#xff1a;自定义窗口拖动的过程中&#xff0c;窗口不能很好的跟随鼠标移动&#xff0c;此外会出现窗口拖动时抖动…

C语言数据结构(11)——归并排序

欢迎来到博主的专栏C语言数据结构 博主ID&#xff1a;代码小豪 文章目录 归并排序两个有序数组的合并归并归并排序 归并排序的代码 归并排序 两个有序数组的合并 当前有两个有序数组arr1和arr2&#xff0c;我们创建一个可以容纳arr1和arr2同等元素个数的新数组arr。 让一个…

蓝桥杯 经验技巧篇

1. 注意事项 &#x1f468;‍&#x1f3eb; 官方通知 &#x1f468;‍&#x1f3eb; 资料文档 时间&#xff1a;4月13日 9:00~13:00 &#xff08;时长 4小时&#xff09;物品 准考证&#xff08;赛前一周开放下载&#xff0c;自行打印&#xff09;学生证身份证笔、水、外套&a…

DDIM,多样性与运行效率之间的trade off

DDPM的重大缺陷在于其在反向扩散的过程中需要逐步从 x t x_t xt​倒推到 x 0 x_0 x0​&#xff0c;因此其推理速度非常缓慢。相反&#xff0c;DDPM的训练过程是很快的&#xff0c;可以直接根据 x 0 x_0 x0​到 x t x_t xt​添加的高斯噪声 ϵ \epsilon ϵ完成一次训练。 为了解…

springboot整合ShardingSphere分库分表并插入1kw条记录

目录 一&#xff0c;数据分片 二&#xff0c;水平分片 三&#xff0c;创建数据库表 四&#xff0c;springboot项目导入依赖 五&#xff0c;创建类 六&#xff0c;bug bug放到最后了。 一&#xff0c;数据分片 数据分片指按照某个维度将存放在单一数据库中的数据分散地存…

(学习日记)2024.04.06:UCOSIII第三十四节:互斥量函数接口讲解

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

【Hadoop技术框架-MapReduce和Yarn的详细描述和部署】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;今天的内容主要是Hadoop的后两个组件&#xff1a;MapReduce和yarn的相关内容。同时还有Hadoop的完整流程。希望对大家有所帮助。感谢大家关注点赞。 &#x1f49e;&#x1f49e;前路漫漫&…

香港科技大学(广州)智能制造学域可持续能源与环境学域博士招生宣讲会——重庆大学专场(暨全额奖学金政策)

两个学域代表教授亲临现场&#xff0c;面对面答疑解惑助攻申请&#xff01;可带简历现场咨询和面试&#xff01; &#x1f4b0;一经录取&#xff0c;享全额奖学金1.5万/月&#xff01; 报名链接&#xff1a;https://www.wjx.top/vm/wmuN2ea.aspx# 地点&#xff1a;重庆大学A区…

观《你想活出怎样的人生》有感

《你想活出怎样的人生》 四月六号&#xff0c;和赵茜小美女观看了宫崎骏导演拍的《你想活出怎样的人生》&#xff0c;感受颇丰&#xff0c;特此写一篇文章以记之。 电影简介 《你想活出怎样的人生》是宫崎骏执导的动画电影&#xff0c;不仅是宫崎骏的复出之作&#xff0c;也…

ARP寻址过程

当知道目标的IP但是不知道目标的Mac地址的时候就需要借助ARP寻址获取目标的Mac地址&#xff0c;传输层借助四元组&#xff08;源IP源端口&#xff1a;目标IP目标端口&#xff09;匹配&#xff0c;网络层借助IP匹配&#xff0c;数据链路层则根据Mac地址匹配&#xff0c;数据传输…

77、WAF攻防——权限控制代码免杀异或运算变量覆盖混淆加密传参

文章目录 WAF规则webshell免杀变异 WAF规则 函数匹配 工具指纹 webshell免杀变异 php 传参带入 eval可以用assert来替换,assert也可以将字符串当作php代码执行漏洞 php 变量覆盖 php 加密 使用加密算法对php后门进行加密 php 异或运算 简化:无字符webshellP 无数字字母rc…

Open3D(C++) 鲁棒损失函数优化的ICP算法

目录 一、损失函数1、关于2、损失函数3、Open3D实现二、代码实现三、结果展示1、配准前1、配准后本文由CSDN点云侠原创,

11、子串-滑动窗口最大值

题解&#xff1a; 双端队列是一种特殊的队列&#xff0c;允许你在队列的两端进行插入和删除操作。在滑动窗口问题中&#xff0c;我们使用它来存储可能是当前窗口最大值的元素的索引。 维护队列的顺序&#xff1a; 当新元素进入窗口时&#xff0c;我们将它与队列尾部的元素进…

307k star, 免费的编程书籍 free-programming-books

307k star, 免费的编程书籍 free-programming-books 分类 开源分享 项目名: free-programming-books -- 各种编程语言免费学习资源 Github 开源地址&#xff1a; https://github.com/EbookFoundation/free-programming-books 查找页面&#xff08;英文&#xff09;&#xff…

在线代码生成器Mybaitis和Mybaitis Plus

功能 支持根据提供的数据信息自动找表和表字段可以单独生成某个文件可以按需生成多个文件(打包为 zip)常用的 vo 和 dto 支持字段自定义(支持多表字段合并)在非包的场景可以不输入 root 包支持批量多表生成支持 lombok 和 swaggerMybaitis和Mybaitis Plus 在页面样式上基本一样…

java流式计算Stream

java流式计算Stream 流(Stream)到底是什么呢? 是数据渠道&#xff0c;用于操作数据源&#xff08;集合、数组等&#xff09;所生成的元素序列。 “集合讲的是数据&#xff0c;流讲的是计算! ” 特点&#xff1a; Stream自己不会存储元素。 Stream不会改变源对象。相反&#x…

分享一份适合练手的软件测试实战项目

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…