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

news2024/11/16 3:33:40

柱状图中最大的矩形

题目链接: 力扣 

假设以柱子1(指值为1的柱子)为基准,柱子1的左侧没有比柱子1矮的元素,所以柱子1可以无限像左边扩展,柱子1的右侧也没有比柱子1矮的元素,所以柱子1可以无限向右边扩展,
所以柱子1的高度可以贯彻整个柱状图,即以柱子1为高度的面积为:1*6=6

以柱子5为基准,柱子5左侧没有比柱子5矮的柱子,说明柱子5左边不能进行扩展了,而柱子5右边第一个比柱子5小的柱子是柱子2,这说明柱子5能够扩展到柱子2(不包含柱子2)

以此,我们要求的就是一个柱子左边和右边第一个比其小的柱子。

所以这题和“接雨水”那道题是类似的,
只不过 接雨水 求得是一个柱子左边和右边第一个比其大的柱子。

所以此时的单调栈是一个单调递减的单调栈了。

当当前元素大于或等于栈顶元素时,将该元素投入单调栈中
当当前元素小于栈顶元素时,比较此时栈顶元素右边元素、栈顶元素、当前元素的大小关系。

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {

        int result = 0;
        stack<int> Mystack;
        heights.insert(heights.begin(),0);
        heights.push_back(0);
        Mystack.push(0);

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

            }
        }

        return result;


    }
};

 

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

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

相关文章

用OpenCV进行图像分割--进阶篇

1. 引言 大家好&#xff0c;我的图像处理爱好者们&#xff01; 在上一篇幅中&#xff0c;我们简单介绍了图像分割领域中的基础知识&#xff0c;包含基于固定阈值的分割和基于OSTU的分割算法。这一次&#xff0c;我们将通过介绍基于色度的分割来进一步巩固大家的基础知识。 闲…

如何提升问卷数据的有效性?

问卷调查法是收集数据的宝贵工具&#xff0c;可以为商业、社会科学和医疗保健等众多领域的决策过程提供真实可靠的数据信息。然而&#xff0c;问卷数据的准确性和可靠性是影响最终结论的关键因素&#xff0c;而他们取决于问卷设计和数据收集过程的质量。在本文中&#xff0c;我…

Coggle 30 Days of ML(23年7月)任务三:使用TFIDF提取文本特征

Coggle 30 Days of ML&#xff08;23年7月&#xff09;任务三&#xff1a;使用TFIDF提取文本特征 任务三&#xff1a;使用TFIDF提取文本特征 说明&#xff1a;在这个任务中&#xff0c;需要使用Sklearn库中的TFIDF技术来提取文本特征&#xff0c;将文本转化为可供机器学习算法…

数分面试题:赛马问题

问题一&#xff1a; 25匹马&#xff0c;一个赛道&#xff0c;每次可以跑5匹马&#xff0c;在没有计时器的情况下&#xff0c;怎么用最小的比赛次数知道最快的前三名 关键点&#xff1a;通过前面的比赛&#xff0c;排除掉没有悬念的马&#xff08;能确定有3匹马比它快的&#…

Iptables与Firewalld

Iptables防火墙 介绍 iptables和netfilter是一套Linux防火墙工具&#xff0c;共同合作完成系统防护工作。iptables 是一个包过滤防火墙&#xff0c;可以对包进行封装、过滤、重定向或者网络地址转换、地址伪装、透明代理、访问控制、连接跟踪等功能&#xff0c;iptables是一个…

4.6 x64dbg 内存扫描与查壳实现

LyScript 插件中默认提供了多种内存特征扫描函数&#xff0c;每一种扫描函数用法各不相同&#xff0c;在使用扫描函数时应首先搞清楚不同函数之间的差异&#xff0c;本章内容将分别详细介绍每一种内存扫描函数是如何灵活运用&#xff0c;并实现一种内存查壳脚本&#xff0c;可快…

Linux常用命令——exec命令

在线Linux命令查询工具 exec 调用并执行指定的命令 补充说明 exec命令用于调用并执行指令的命令。exec命令通常用在shell脚本程序中&#xff0c;可以调用其他的命令。如果在当前终端中使用命令&#xff0c;则当指定的命令执行完毕后会立即退出终端。 语法 exec(选项)(参数…

计算机组成原理32位MIPS CPU设计实验(指令译码器电路设计 、时序发生器状态机设计、时序发生器输出函数、硬布线控制器)

实验四 32位MIPS CPU设计实验 这次实验是32位MIPS CPU设计实验&#xff08;单总线CPU-定长指令周期-3级时序)&#xff0c;在头歌当中一共需要我们进行六道题的测试&#xff0c;分别为MIPS指令译码器设计&#xff0c;定长指令周期&#xff08;时序发生FSM设计&#xff0c;时序发…

数据结构05:树与二叉树[C++][哈夫曼树HuffmanTree]

图源&#xff1a;文心一言 考研笔记整理6k字&#xff0c;小白友好、代码可跑&#xff0c;请小伙伴放心食用~~&#x1f95d;&#x1f95d; 第1版&#xff1a;查资料、画导图、画配图~&#x1f9e9;&#x1f9e9; 参考用书&#xff1a;王道考研《2024年 数据结构考研复习指导》…

一纸文书之MySQL的回忆录

MySQL要点学习&#xff1a;你可以在简历上说熟悉MySQL 什么是数据库&#xff1f;什么是数据库管理系统&#xff1f;什么是MySQL&#xff1f;什么是SQL&#xff1f;数据库数据库管理系统&#xff1a;SQL&#xff1a;结构化查询语言三者之间的关系 安装MySQL数据库管理系统MySQL常…

数据增强之裁剪、翻转与旋转

文章和代码已经归档至【Github仓库&#xff1a;https://github.com/timerring/dive-into-AI 】或者公众号【AIShareLab】回复 pytorch教程 也可获取。 文章目录 数据增强 Data Augmentation裁剪Croptransforms.CenterCroptransforms.RandomCroptransforms.RandomResizedCroptra…

【雕爷学编程】Arduino动手做(153)---2.4寸TFT液晶触摸屏模块7

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

TortoiseGit 入门指南02:创建和克隆仓库

图标 本节讲解如何使用 TortoiseGit 创建和克隆仓库。但在此之前&#xff0c;我们先来看下 TortoiseGit 软件的一个特色&#xff1a;图标。 TortoiseGit 会给 工作区 中的文件和文件夹叠加图标&#xff08;Icon Overlays&#xff09;&#xff0c;图标反应的是这些文件和文件夹…

跳表很难吗?手把手教你如何跳跃它!

文章目录 Ⅰ. 前言Ⅱ. 跳表&#xff08;skiplist&#xff09;1、什么是跳表2、跳表的发明历程3、跳表的搜索方式 Ⅲ. skiplist的算法性能分析1、理论准备2、性能分析&#xff08;了解即可&#xff0c;主要记结论&#xff09; Ⅳ. skiplist与平衡树、哈希表的比较Ⅴ. skiplist的…

【数字信号处理】线性调频Z(Chirp-Z,CZT)算法详解

CZT变换算法的引入 CZT算法的基本原理 注意:这里所要分析的复频谱点数为 M M M,这也是CZT变换之后的点数。

MySQL之DML和DDL

1、显示所有职工的基本信息&#xff1a; 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 3、求出所有职工的人数。 4、列出最高工和最低工资。 5、列出职工的平均工资和总工资。 6、创建一个只有职工号、姓名和参加工作的新表&#xff0c;名为工作日期表。 …

CentOS环境下的MYSQL8安装

MySQL 安装 参考连接&#xff1a;https://www.cnblogs.com/jasonx1an/p/16690866.html 下载 下载网址&#xff1a;https://dev.mysql.com/downloads/mysql/ 卸载 mariadb 查看 mariadb rpm -qa|grep mariadb卸载 mariadb rpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps再…

深度学习调参技巧

一、常用的网络模型训练技巧&#xff1f; 使用更大的 batch size。使用更大的 batch size 可以加快训练的进度。但是对于凸优化问题&#xff0c;收敛速度会随着 batch size 的增加而降低。所以在相同的 epoch 下&#xff0c;使用更大的 batch size 可能会导致验证集的 acc更低…

Unittest加载执行用例的方法总结

目录 前言 方式1 方式2 方式3 方式4 方式5 方式6 方式7 总结 前言 说到测试框架&#xff0c;unittest是我最先接触的自动化测试框架之一了&#xff0c; 而且也是用的时间最长的&#xff0c; unittest框架有很多方法加载用例&#xff0c;让我们针对不同的项目&#xff0…