LeetCode 84.柱状图中最大的矩形

news2025/8/8 2:34:31

今天还是分享一道才刷过的题目, 柱状图中最大的矩形,这道题根上一篇我分享的接雨水类似,都是可以用双指针,动态规划(双指针加备忘录),单调栈来算

这道题的话三种方法都写了,双指针会超时,优化一下备忘录是可以的。不过这篇还是分享一下用单调栈的做法。毕竟上一道题我没写这种方法哈哈哈

单调栈一般解决的问题都是类似的,找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,用空间去换时间的一种思路,栈里一般放的是元素下标

比方说找比当前元素第一个大的元素,我们就可以构建一个单调递减的栈,栈里元素从栈底到栈顶是依次减小的,如果遇到个元素比栈顶元素大,那么就说明这个栈顶元素找到了比自己大的第一个数字..一般就是一个for去遍历,里面套一个while,while来操作栈

有关单调栈的一些简单介绍可以看看甜姐的视频,我贴在这里了

刷题论|单调栈真没你想的那么难

这篇重点还是在将这道题,用单调栈的思路来说

这道题和接雨水一点不同,接雨水那个是找每个柱子左右两边最高的,只有找到最高的才能构成凹,里面才能接上水 

而这道题呢根据力扣上面的图示我再形象一下

就是这么个图,我们比方说此时在i这个位置的柱子,找他能构成矩形的最大面积,肯定就是往右往左走,看图就能看出来,i往右边画不了了,因此挨着的都比他小,往左边可以画,直到画到要小于他的那个位置。

因此我们就能懂了,这道题要找柱子两边第一个比他矮的位置,找到之后两个位置的区间就是构成矩形的长

从示例就能看出,找到右边第一个比他矮的下标为right,左边第一个比他矮的下标为left,那么这个柱子能构成最大矩形的长为(right-left-1)

这篇文章我刚开始也说了,如果找第一个最大的元素,那么去维护一个递减的单调栈

那这个题既然要找第一个小的,我们如果去维护一个递增的单调栈,就是去找第一个最小元素解释一下:如果数组元素 2 3 5 4 1,栈里面比如此时是2 3 5 ,此时我们遍历到数组元素是4,如果4入栈的话就会破坏栈的单调性,因为4比此时栈顶小,那么栈顶出栈,说明此时栈顶元素5找到了第一个比他小的元素,就是4,记录一下。5出栈了之后,3就成了新栈顶,4比3大,那么4继续入栈,现在遍历1,1比4小,4出栈说明,1是4最近的比他小的元素;4出栈,栈里剩了2 3,然后循环继,1比较发现,1比3也小,如果1入栈的话又破坏单调性了,所以3出栈,1也是3最近的一个比他小的元素....一次下去,记住一般入栈入的都是数组下标,stack记录的是下标!!我们根据下标去修改对应位置元素

大概就是这种基本思路,单调栈一类的题

 注意:

  1. 栈入的是下标,但是是按元素来比,到时候根据下标来记录对应元素所需要的值
  2. 给数组加两个哨兵结点,遇到边界调节,比如最左边元素的矩形,他没有左边了,right-left-1就会有问题,右边同理,怕他一直是单调递增的,没法正常计算

  3. 这样操作的话while里面求w=right-left-1的时候,边界就不用做特殊判断了

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        stack<int>sk;
        int res=0;
        //加两个哨兵结点,遇到边界调节比如最左边元素的矩形,他没有左边了,right-left-1就会有问题
        //这样操作的话while里面求w=right-left-1的时候,边界就不用做特殊判断了
        heights.insert(heights.begin(),0);
        heights.emplace_back(0);

        sk.push(0);//把第一个元素下标加进去,其实就是上面新增的左哨兵,

        for(int i=1;i<heights.size();++i)
        {
            //heights[i] < heights[stk.top()]就是我们要计算以stk.top()这个柱子为矩形高度的矩形的时候了
           
            while(heights[i]<heights[sk.top()])//第一个比他小
            {
                //我直接按照对应的元素来解释了,虽然入的是下标
                int index=sk.top();//sk里面是 2 3 5  此时5是top,遍历height[i]是4,
                                     //说明5找到了右边比他小的了
                                                  
                sk.pop();    //5出栈  剩了2 3  因为构成了单调递增栈
                int left=sk.top();   //3就是 5左边第一个比他小的,算一下他对应位置
                int right=i;   //右边第一个比他矮的位置
                int w=right-left-1; //算一下此时5的最大矩形长
                int h=heights[index];//5的高度
                res=max(res,w*h);  //5 最大矩形的面积
            }
            sk.push(i);
        }
        return res;

    }
};

好嘞好嘞,今日记录就到这,跟上一节接雨水放在一起咯

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

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

相关文章

pdf生成:puppeteer

一、Puppeteer Puppeteer是Google Chrome团队出品的一款无界面Chrome工具&#xff0c;它提供了丰富的API&#xff0c;让开发者像鼠标一样控制浏览器的各种行为。Puppeteer是一个Node库&#xff0c;提供发了一个高级API来通过DevTools协议控制Chromium或Chrome。Puppeteer默认以…

SDN实战团技术分享(三十八):DPDK助力NFV与云计算

DPDK最初动机很简单&#xff0c;网络处理器的软件解决方案&#xff0c;证明IA多核处理器能够支撑高性能数据包处理。 什么是DPDK&#xff1f;对于用户来说&#xff0c;它可能是一个出色的包数据处理性能加速软件库&#xff1b;对于开发者来说&#xff0c;它可能是一个实践包处…

配置鼠标右键edit with notepad

注&#xff1a;notepad为一个轻量级的代码文本编辑器&#xff0c;还可以安装代码对比工具等&#xff0c;大大提供办公效率&#xff0c;十分方便。安装后&#xff0c;可能右键无法直接用notepad打开&#xff0c;需要在软件中&#xff0c;选择文件打开&#xff0c;本文介绍如果设…

内网Windows Git Server部署

疫情下&#xff0c;公司与家用电脑切换&#xff0c;导致代码更新接不上&#xff0c;最最最重要公司代码不能上传外网&#xff0c;因此内网 Git Server部署这稿子。 Server部署主要安装【Java、Git、TortoiseGit、Gitblit】前三为傻瓜安装&#xff0c;重点为Gitblit配置修改及部…

Flutter高仿微信-第36篇-单聊-语音通话

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 目前市场上第三方音频接口的价格高的吓人 语音通话价格&#xff1a; 5元/千分钟…

大规模ddos攻击事件,ddos攻击会暴露ip吗

1月4日&#xff0c;谷歌云安全可靠性工程师Damian Menscher在推特上表示&#xff0c;根据CVE-2021-22205漏洞利用报告&#xff0c;有攻击者正在利用 GitLab 托管服务器上的安全漏洞来构建僵尸网络&#xff0c;并发起规模惊人的分布式拒绝服务攻击&#xff08;DDoS&#xff09;其…

产品新人必看:入职前的准备及快速适应产品工作

​我第一次做分享&#xff0c;没有什么经验&#xff0c;不知道能不能讲好。 我先自我介绍一下&#xff0c;我是从UED转产品的&#xff0c;我现在这家公司已经快干了一年了&#xff0c;我是去年的5月份入职的。 求职期间陪学也帮了我很多忙&#xff0c;我基本上是全天有什么问…

线上课和线下课各自优缺点,PLC工程师进阶上位机应该知道

先说线上课优点&#xff1a; 价格较低&#xff0c; 视频学习&#xff0c;可以随时随地学习&#xff0c;不用辞职学习&#xff0c;降低职业风险 缺点&#xff1a; 没有学习氛围&#xff0c;对于自制能力差的同学&#xff0c;很难坚持下去 没有老师指点&#xff0c;一旦遇到问题很…

利用Amber热力学积分计算相对自由能变化

上周四&#xff0c;何博士为大家在北鲲云的直播间分享了Amber热力学积分计算相对自由能变化&#xff08;直播回放可在视频号&#xff1a;北鲲云-直播回放中查看&#xff09;。 直播结束后有很多小伙伴来向我们要PPT资料&#xff0c;这里何博士也为大家准备了文字版本的教程。将…

企业实战!基于Harbor搭建企业镜像仓库

企业实战&#xff01;基于Harbor搭建企业镜像仓库 虽然Docker官方提供了Docker Hub作为公共的Registry服务器&#xff0c;给到用户进行镜像的保存和管理工作。但对于企业而言&#xff0c;考虑到安全性和网络效率等原因&#xff0c;通常会搭建私有的Registry服务器&#xff0c;用…

<C++>深度学习多态

目录 一、概念 二、多态的定义及实现 虚函数重写的两个例外&#xff1a; C11override 和 rinal 三、抽象类 接口继承和实现继承 四、多态的原理 五、单继承和多继承中的虚函数表 六、继承和多态常见的面试题 一、概念 概念&#xff1a;通俗来说&#xff0c;就是多种形…

Redis数据库redisDb源码分析

写在前面 以下内容是基于Redis 6.2.6 版本整理总结 一、组织方式 Redis服务器将所有的数据库 都保存在src/server.h/redisServer结构中的db数组中。db数组的每个entry都是src/server.h/redisDb结构&#xff0c;每个redisDb结构代表一个数据库。Redis默认有16个数据库。 1.1…

TDengine安装使用

引言 近期&#xff0c;听说了时序数据库TDengine&#xff0c;本人的好奇心又出来了&#xff0c;同是时序数据库的InfluxDB不也挺好的嘛&#xff1f;通过一些网上的资料以及些简单的实际操作&#xff0c;本人得出的结论是&#xff1a; 数据量少时&#xff0c;InfluxDB的性能好些…

MCE | TGF-β 信号通路

转化生长因子 (Transforming growth factor beta&#xff0c;TGF-β) 是一类多功能的细胞因子&#xff0c;可由多种组织细胞产生。TGF-β 信号通路是由众多成员的多功能细胞因子&#xff0c;与相应的受体、细胞内信号转导分子组成的通路&#xff0c;能影响疾病发生和发展&#…

win10利用minikube在自己的电脑上搭建k8s

首先默认你的电脑上装了docker&#xff0c;没有的话参考这篇 下面开始步入正题&#xff1a; 步骤讲解 首先下载minikube,点击这个链接&#xff0c;根据自己的环境生成相应的配置命令&#xff0c;我自己的话是64位win10系统&#xff0c;管理员打开cmd运行命令如下&#xff1a…

Flutter高仿微信-第33篇-单聊-图片

Flutter高仿微信系列共59篇&#xff0c;从Flutter客户端、Kotlin客户端、Web服务器、数据库表结构、Xmpp即时通讯服务器、视频通话服务器、腾讯云服务器全面讲解。 详情请查看 效果图&#xff1a; 详情请参考 Flutter高仿微信-第29篇-单聊 &#xff0c; 这里只是提取图片实现的…

更简洁的参数校验,使用 SpringBoot Validation 对参数进行校验

在开发接口时&#xff0c;如果要对参数进行校验&#xff0c;你会怎么写&#xff1f;编写 if-else 吗&#xff1f;虽然也能达到效果&#xff0c;但是不够优雅。 今天&#xff0c;推荐一种更简洁的写法&#xff0c;使用 SpringBoot Validation 对方法参数进行校验&#xff0c;特…

k8s dashboard安装部署实战详细手册

文章目录一、k8s dashboard搭建1.选择版本2.下载yaml3.执行yaml4.访问dashboard5.token登录6.配置权限结尾一、k8s dashboard搭建 1.选择版本 dashboard和k8s存在版本对应关系&#xff0c;具体可以去github查找https://github.com/kubernetes/dashboard/releases 由于我的k8s…

亮相2022南京软博会,创邻科技携Galaxybase图平台展现信创硬核实力

11月23日&#xff0c;2022中国&#xff08;南京&#xff09;国际软件产品和信息服务交易博览会&#xff08;以下简称”软博会“&#xff09;在南京博览中心隆重开幕。此次展会以“软件赋能 数智转型”为主题&#xff0c;由江苏省工业和信息化厅、南京市人民政府、中国工业技术软…

iwebsec靶场 数据库漏洞通关1-MySQL数据库漏洞

iwebsec靶场的数据库漏洞第一项内容为MySQL弱口令漏洞渗透&#xff0c;如下所示我们可以使用kali的msf模块对其进行渗透。 一、获取iwebsec虚拟机环境的MySQL服务映射的端口号 由于iwebsec靶场是通过docker搭建在ubuntu这个宿主虚拟机中 接下来在机器在ubuntu64位这台虚拟机里…