Leetcode:84. 柱状图中最大的矩形(单调栈C++)

news2024/11/28 6:53:45

目录

84. 柱状图中最大的矩形

问题描述:

实现代码与解析:

单调栈

原理思路: 


84. 柱状图中最大的矩形

问题描述:

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

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

示例 1:

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

示例 2:

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

实现代码与解析:

单调栈

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        
        stack<int> stk;
        int res = 0;
        heights.insert(heights.begin(), 0);
        heights.push_back(0);
        stk.push(0);
        for (int i = 1; i < heights.size(); i++)
        {
            //栈里元素递增(从栈底到在栈顶)
            while (heights[i] < heights[stk.top()])
            {
                int mid = stk.top();
                stk.pop();
                int w = i - stk.top() - 1;
                int h = heights[mid];
                res = max(res, w * h);
            }
            stk.push(i);
        }

        return res;
    }
};

原理思路: 

        此题思想与Leetcode:42. 接雨水(单调栈C++)_Cosmoshhhyyy的博客-CSDN博客

相似,但是又有不同,可以先看看上面这题,对于本题思想更容易理解。

        还是单调栈的思路,但是这次我们栈的单调是从小到大(栈底到栈顶),我们要找的是第 i 个元素左侧的第一个比其大的值。把三个矩形看成一组来计算(这只是帮助理解的,其实消去多的话并不是三个,当然不算消去的就还是三个),根据我们的单调,此三个矩形就是:

左:栈顶元素的下面的元素      低

中:栈顶元素                           高

右:将要入栈的元素                低

        所以宽w = i - stk.top() - 1;高h = heights[mid];就可以求出此组的三个矩形所组成的最大矩形面具为 w * h

        这里可能会有人想为什么不是 w = i - stk.top(); h = heights[stk.top](栈中第二个的高),运行可以对一部分测试样例。一开始我也理解错了,这里第一次求的是中间mid的矩形,因为每一个单个的矩形也算在其中。若图像为这样:

        第一次while其实算的是左侧的红色面积,第二次while才是算的右侧红色面积,第二次while中的mid变为第一次左侧的矩形。如果按照我们错误的思路是直接计算了右侧的图而忽略了左侧的情况。根据代码代入走一步就能真正的理解了。

        至于为什么栈和数组前面都加上0呢,因为是三个为一组嘛,将0加入,第二个元素肯定比0大,那么在循环到第三个元素时,就能确保是三个了。

        对于为什么数组后面加上0呢,因为我们写单调栈都会遇到最好栈里还有元素未弹出,我们把0入栈,就可以得到所有的结果并且栈里没有元素了。

        我们将每一个结果比较取一个最大值,这样就能得到最终结果啦。

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

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

相关文章

Redis 7 十大数据类型

10大数据结构图示 10大数据类型&#xff1a; redis字符串(String)redis列表(ist)redis哈希表(Hash)redis集合(Set)redis有序集合(ZSet)redis地理空间(GEO)redis基数统计(HyperLogLog)redis位图(bitmap)redis位域(bitfield)redis流(Stream) Redis键(key) 命令不区分大小写&am…

数据结构-堆的创建(详解)

目录 堆的概念及结构 堆的实现 堆的向上调整算法 代码实现&#xff1a; 思路详解&#xff1a; 堆的向下调整算法 代码实现&#xff1a; 思路详解&#xff1a; 堆的创建&#xff1a; 堆结构的定义及相关函数的声明&#xff1a; 堆的初始化&#xff1a; 堆的销毁&#x…

如何减少图片大小内存?压缩图片内存大小的方法介绍

什么时候需要压缩图片内存大小 随着移动设备的普及和社交媒体的盛行&#xff0c;我们经常需要通过分享图片来传达信息和与他人互动。然而&#xff0c;有时候图片的文件大小过大&#xff0c;可能会导致上传、下载或发送过程中遇到问题。以下是一些常见情况下需要压缩图片内存大…

插值应用案例2

案例1 高点和高程 在一丘陵地带测量高程&#xff0c;x和y方向每隔100m测一个点&#xff0c;得到高程如下表所列&#xff0c;试插值一曲面&#xff0c;确定合适的模型&#xff0c;并由此测到最高点和相应的高程。 x0/z0\y0 100 200 300 400 500 100 636 697 624 478 …

Android GlSurfaceView 入门教程 : 绘制一个三角形

1. GlSurfaceView是什么 GlSurfaceView是Android中的一个类&#xff0c;继承自SurfaceView&#xff0c;用于显示OpenGL ES图形渲染的一个视图。 OpenGL ES是一种跨平台的图形API&#xff0c;用于渲染2D和3D图形&#xff0c;也可以将相机的画面显示到GlSurfaceView上&#xff0…

Spring Boot 中的 SQL 注入攻击是什么,原理,如何预防

Spring Boot 中的 SQL 注入攻击是什么&#xff0c;原理&#xff0c;如何预防 随着互联网的发展&#xff0c;Web 应用程序的数量不断增加&#xff0c;而 SQL 注入攻击也成为了常见的网络安全问题之一。SQL 注入攻击是通过在 Web 应用程序中注入恶意的 SQL 代码&#xff0c;从而…

@RestController 和 @Controller的区别?

Controller 返回一个页面单独使用 Controller 不加 ResponseBody的话一般使用在要返回一个视图的情况&#xff0c;这种情况属于比较传统的Spring MVC 的应用&#xff0c;对应于前后端不分离的情况 RestController 返回JSON 或 XML 形式数据 但RestController只返回对象&#…

FPGA综合设计实验:基于PWM脉宽调制的呼吸流水灯设计

目录 一、引言 二、项目准备 1.项目预期目标 2.项目原理及总体实现思路 三、项目模块设计 1.顶层模块 2.按键控制模块 3.呼吸灯模块 4.数码管显示模块 5.二进制转BCD码模块 四、项目测试 1.仿真测试 2.实物测试 五、项目总结 1.选题思考与过程反思 2.设计的具体…

MySQL之常见的CRUD面试题【上】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于MySQL数据库的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 导读&#xff1a; 一.数据库的连表…

如何获得免费英文文献翻译呢?

我偶然之间发现的一个小技巧分享给大家&#xff01; 这个方法很简单&#xff0c;巧妙地运用了某外国浏览器自带的翻译功能&#xff0c;所以我们需要的是某外国浏览器 1.将需要翻译的pdf文档保存 2.进入http://pdfdo.com/pdf-to-html.aspx将PDF转为网页 3. 上传文件后耐心等待转…

web学习--SpringMVC--1 基础学习

写在前面&#xff1a; 所有的web学习基于springboot项目&#xff0c;而不会去单独的使用spring来进行。 文章目录 SpringMVC介绍原理MVC模式 入门使用导入依赖编写controller类 详细介绍注解详解ControllerRequestMappingResponseBodyRestControllerRequestParamRequestBodyR…

聚观早报 | 字节跳动要造机器人;苹果已开发悬空虚拟键盘

今日要闻&#xff1a;字节跳动要造机器人&#xff1b;苹果已开发悬空虚拟键盘&#xff1b;苹果汽车或售价9万美元&#xff1b;全球首例猪心脏移植患者仅存活60天&#xff1b;首款搭载ChatGPT的自行车问世 字节跳动要造机器人 7 月 3 日消息&#xff0c;「机器人」作为未来科技…

MySQL-分库分表详解(四)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

记录安装ESXI-6.7遇到的问题(DELL)

从官网下载完ISO镜像,使用rufus制作启动盘 安装过程中报错信息 缺少网卡驱动 安装打包网卡驱动请查看此链接:https://www.cnblogs.com/Sunzz/p/11438066.html 通过检测网卡驱动后,报错信息 解决办法 关闭BIOS中的Secure Boot 具体步骤如下&#xff1a; 1.按F2进入bios 2…

最长回文子串 (力扣) 动态规划 JAVA

给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s “babad” 输出&#xff1a;“bab” 解释&#xff1a;“aba” 同样是符合题意的答案。 示例 2&#…

FlinkSQL 解析字符串+行转列

近期遇到一个实时flinksql需求&#xff0c;需要根据ids数组字段解析成名称数组字段。。。 其中parent_path存放的内容是点号分割的字符串"1659077318807721985.1659120595539924993.1659121050219255810" 第一步&#xff1a;新建kafka source源 create TEMPORARY t…

怎样处理服务器无法复制粘贴问题?服务器不能复制粘贴怎么办?

我们经常需要在服务器上进行一些操作&#xff0c;如复制粘贴文件、修改配置等等。但有时候我们会遇到服务器无法使用复制粘贴功能的问题&#xff0c;这时该怎么办呢&#xff1f;以下是一些解决方法。 1&#xff0e;检查RDP剪贴板功能是否开启 在远程桌面连接(RDP)中&#xff…

基于多案例系统学习防洪评价报告编制方法与水流数学模型建模

查看原文>>>基于多案例系统学习防洪评价报告编制方法与水流数学模型建模 随着社会经济的快速发展&#xff0c;我国河道周边土地开发利用率不断增大&#xff0c;临河建筑物与日俱增&#xff0c;部分河道侵占严重&#xff0c;导致防洪压力增大。加之部分河流沿岸临河建…

Win10无法安装到这个磁盘,选中的磁盘具有mbr分区

关闭这个窗口执行一下操作; 1.按住 shiftF10快捷键&#xff0c;打开命令提示符终端&#xff1b; 2.输入diskpart &#xff0c;并按下回车 &#xff1b; 3.输入list disk&#xff0c;并按下回车&#xff0c;查看盘的使用情况 ; 4.输入 select disk 0 &#xff0c;并按下回车&am…