代码随想录算法训练营第六十天 | 84. 柱状图中最大的矩形

news2025/1/16 16:43:24

84. 柱状图中最大的矩形

本题与接雨水问题的区别是记录每个柱子左边第一个小于该柱子的下标,而不是左边第一个小于该柱子的高度。

因为本题是要找每个柱子左右两边第一个小于该柱子的柱子,所以从栈头(元素从栈头弹出)到栈底的顺序应该是从大到小的顺序!

如图:        

只有栈里从大到小的顺序,才能保证栈顶元素找到左右两边第一个小于栈顶元素的柱子。

栈顶和栈顶的下一个元素以及要入栈的三个元素组成了求最大面积的高度和宽度

主要就是分析清楚如下三种情况:

  • 情况一:当前遍历的元素heights[i]大于栈顶元素heights[st.top()]的情况
  • 情况二:当前遍历的元素heights[i]等于栈顶元素heights[st.top()]的情况
  • 情况三:当前遍历的元素heights[i]小于栈顶元素heights[st.top()]的情况
class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int result = 0;
        stack<int> st;
        //在数组的头部和尾部加入0
        heights.insert(heights.begin(), 0);
        heights.push_back(0);

        st.push(0);
        for (int i = 1; i < heights.size(); i++) {
            if (heights[i] > heights[st.top()]) {
                st.push(i);
            } else if (heights[i] == heights[st.top()]) {
                st.push(i);
            } else {
                while(!st.empty() && heights[i] < heights[st.top()]) {
                    int mid = st.top();
                    st.pop();
                    if (!st.empty()) {
                        int left = st.top();
                        int right = i;
                        int w = right - left - 1;
                        int h = heights[mid];
                        result = max(result, w * h);
                    }
                }
                st.push(i);
            }
        }
        return result;
    }
};

末尾为什么要加元素0?

如果数组本身就是升序的,例如[2,4,6,8],那么入栈之后 都是单调递减,一直都没有走 情况三 计算结果的哪一步,所以最后输出的就是0了。 如图:

那么结尾加一个0,就会让栈里的所有元素,走到情况三的逻辑。

开头为什么要加元素0?

如果数组本身是降序的,例如 [8,6,4,2],在 8 入栈后,6 开始与8 进行比较,此时我们得到 mid(8),rigt(6),但是得不到 left。

(mid、left,right 都是对应版本一里的逻辑)

因为 将 8 弹出之后,栈里没有元素了,那么为了避免空栈取值,直接跳过了计算结果的逻辑。

之后又将6 加入栈(此时8已经弹出了),然后 就是 4 与 栈口元素 8 进行比较,周而复始,那么计算的最后结果resutl就是0。 如图所示:

所以我们需要在 height数组前后各加一个元素0。

 

 

 

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

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

相关文章

恢复误删文件

误删恢复 用losf恢复进程存在的文件 注意此处要后台进程存在 创建一个文件&#xff0c;用tail命令&#xff0c;模拟文件一直被监听 打开另外一个终端&#xff0c;删除这个文件 用lsof命令查看被删除的文件&#xff0c;可以发现文件虽然被删除&#xff0c;但是进程依然在 然后…

Make-A-Video(造啊视频)——无需文字-视频数据的文字转视频(文生视频)生成方法

© 2022 Uriel Singer et al (Meta AI) © 2023 Conmajia 本文基于论文 Make-A-Video: Text-to-Video Generation without Text-Video Data&#xff08;2209.14792&#xff09;。 本文已获论文第一作者 Uriel Singer 授权。 本视频由这句话生成&#xff1a;穿着超人装…

javaweb学生在线考试系统dzkf10程序

打分&#xff09;、系统管理&#xff08;数据备份&#xff09;等功能操作。 以学生的身份在登录页面输入账号和密码&#xff0c;经过数据库身份验证&#xff0c;验证成功后登录系统主页&#xff0c;可以使用个人资料管理、试卷查看、在线考试、在线答疑、个人考试成绩查询等功能…

微任务宏任务详解题目

注意点&#xff1a;我们的异步任务1和异步任务2并不是直接放在任务队列里面&#xff0c;而是先挂载到我们相应的线程下面&#xff01;&#xff01;&#xff01; 假如说我们的宏任务执行得很快&#xff0c;100ms就执行完了&#xff0c;那么我们就会去轮询我们的任务队列&#x…

C++linux高并发服务器项目实践 day3

Clinux高并发服务器项目实践 day3 文件IO标准C库IO函数与LinuxIO函数虚拟地址空间文件描述符Linux系统IO函数open与close mode:八进制的数&#xff0c;表示用户对创建出的新的文件的操作权限 最终的权限是&#xff1a;mode & ~umask 0777 r(读) w(写) x(可执行)都有这样的权…

2021遥感应用组二等奖:近20年黄河流域植被动态与生态环境效应

作品介绍 1 研究目的 基于MODIS NDVI植被指数、土地利用数据和气象数据集&#xff0c;辅以趋势分析、偏相关分析、马尔科夫转移矩阵变化分析、多元回归分析等方法&#xff0c;全面分析黄河流域2001-2020年植被时空变化特征&#xff0c;并通过构建统计模型方式&#xff0c;定量…

【Seata】Seata配置上传Nacos

前言 在seata1.4.2版本之后&#xff0c;Seata可以通过dataId配置seata的所有配置项&#xff0c;也就是说&#xff0c;我们可以将之前上传的所有配置项整合到一个配置文件中&#xff0c;接下来直接演示该怎样操作。 如果你不清楚seata的config.txt文件在哪里下载或者其它的一些…

c++11 标准模板(STL)(std::queue)(五)

定义于头文件 <queue> template< class T, class Container std::deque<T> > class queue; std::queue 类是容器适配器&#xff0c;它给予程序员队列的功能——尤其是 FIFO &#xff08;先进先出&#xff09;数据结构。 类模板表现为底层容器的包…

kali相关操作

目录 kali换源&#xff1a; 由于没有公钥&#xff0c;无法验证下列签名&#xff1a; NO_PUBKEY 871920D1991BC93C 安装中文 设置中文输入法 kali换源&#xff1a; sudo su 备份相关配置 cp /etc/apt/sources.list /etc/apt/sources.list.bak vim /etc/apt/sources.list替…

搭建SFTP服务安全共享文件,实现在外远程访问「内网穿透」

文章目录 1.前言2.本地SFTP服务器搭建2.1.SFTP软件的下载和安装2.2.配置SFTP站点2.3.Cpolar下载和安装 3.SFTP服务器的发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的网络发达&#xff0c;个人电脑容量快速上升&#xff0c;想要保存的数据资料…

最近,我们做了一次“实景”容灾演练

保障头部新闻客户端的业务连续性&#xff0c;阿里云帮助客户在真实场景下完成容灾演练。 云计算和新闻 APP&#xff0c;能有什么关系&#xff1f; 2021 年&#xff0c;传媒行业某头部媒体的新闻客户端进行了全新改版并升级上线&#xff0c;以 “内容技术”的融合驱动效率提升&a…

Vue2-黑马(十)

目录&#xff1a; &#xff08;1&#xff09;vuex-actions &#xff08;2&#xff09;vuex-调用actions &#xff08;3&#xff09;vue2实战-项目搭建 &#xff08;1&#xff09;vuex-actions 有这么一个需求&#xff0c;绿色的组件从服务器获取数据放入store&#xff0c;主…

CHAPTER 2: 《BACK-OF-THE-ENVELOPE ESTIMATION》 第2章 《初略的估计》

CHAPTER 2: BACK-OF-THE-ENVELOPE ESTIMATION 在系统设计面试中&#xff0c;有时您会被要求估计系统容量或使用粗略估计的性能需求。根据杰夫迪恩的说法&#xff0c;谷歌高级研究员&#xff0c;“粗略的计算是你使用结合思想实验和常见的性能数字&#xff0c;以获得良好的感觉…

武器目标分配问题研究进展: 模型、算法与应用

源自&#xff1a;系统公正与电子技术 作者&#xff1a;李梦杰 常雪凝 石建迈 陈超 黄金才 刘忠 摘 要 武器目标分配问题是指挥控制与任务规划领域的关键难点之一, 也是军事运筹领域的基础研究课题。经过多年研究, 武器目标分配问题在陆海空天电等领域都得到了广泛研究,…

ESLint插件开发

ESLint 插件 ESLint 插件是一个可以包含一系列ESLint 规则、配置、处理器、环境的npm模块。 创建插件 开发ESLint插件可以使用Yeoman提供的生成器来生成ESLint插件的基本项目的目录结构。 安装yeoman 和ESLint 规则的生成器 npm i -g yo generator-eslint创建eslint-xxxx使用y…

春秋云境:CVE-2022-26201(二次注入漏洞)

目录 一、题目 二、上传权限马 三、蚁剑马连接 一、题目 进入题目&#xff1a; 这个是和春秋云境&#xff1a;CVE-2022-28060一个网站&#xff0c;看来应该是存在多个漏洞。 点击admin 不用登录 Users ---- add users 选择文件 这里要是jpg图片格式 如果是php格式是无法运行…

机器学习(一)-K近邻算法(KNN)原理剖析及python源码

本篇介绍第一个机器学习算法&#xff1a;k-近邻算法&#xff0c;它非常有效而且易于掌握。首先&#xff0c;我们将探讨k-近邻算法&#xff08;KNN&#xff09;的基本理论&#xff0c;以及如何使用距离测量的方法分类物品&#xff1b;其次我们将使用Python从文本文件中导入并解析…

JavaSE学习进阶day06_02 Set集合和Set接口

第二章 Set系列集合和Set接口 Set集合概述&#xff1a;前面学习了Collection集合下的List集合&#xff0c;现在继续学习它的另一个分支&#xff0c;Set集合。 set系列集合的特点&#xff1a; Set接口&#xff1a; java.util.Set接口和java.util.List接口一样&#xff0c;同样…

D. Marcin and Training Camp(思维 + 判断一个数二进制位是否是另一个数的子集)

Problem - D - Codeforces 马辛是他大学里的一名教练。有N个学生想参加训练营。马辛是个聪明的教练&#xff0c;所以他只想派那些能冷静合作的学生参加。 让我们关注一下这些学生。每个学生可以用两个整数ai和bi来描述&#xff1b;bi等于第i个学生的技能水平&#xff08;越高越…