栈求解最大矩形

2023-05-16

题目描述

给一个直方图,求直方图中的最大矩形的面积。例如,下面这个图片中直方图的高度从左到右分别是2, 1, 4, 5, 1, 3, 3, 他们的宽都是1,其中最大的矩形是阴影部分。
在这里插入图片描述

Input

输入包含多组数据。每组数据用一个整数n来表示直方图中小矩形的个数,你可以假定1 <= n <= 100000. 然后接下来n个整数h1, …, hn, 满足 0 <= hi <= 1000000000. 这些数字表示直方图中从左到右每个小矩形的高度,每个小矩形的宽度为1。 测试数据以0结尾。

Output

对于每组测试数据输出一行一个整数表示答案。

Sample Input

7 2 1 4 5 1 3 3
4 1000 1000 1000 1000
0

Sample Output

8
4000

解题思路

本题的思路较为难想到,小白如果第一次遇到这道题的话可能一下很懵(比如我),但是有经验的人就会瞬间想到思路。要计算最大的矩形面积,就要使得底×高最大。如果确定了底,就要使高尽可能大,如果确定了高,就要使底尽可能大。而本题中可以确定的是高,方法是:可以依次遍历每一个小的矩形,然后向两边扩展,找到第一个小于此高度的点,这便是以这个矩形为高所求得的最大面积,最后将遍历求得的面积取最大值即可。
比较容易想到的是使用栈结构,本来我刚开始在遍历每个矩形都建立一个栈,但是由于时间复杂度的要求很高,后面对代码进行优化,使用一个栈便可以实现,只需要进行适当的出栈操作即可,大大降低了复杂度。

代码

#include<iostream>
#include<stack>
using namespace std;
struct node
{
	int order;//第几块矩形
	long long h;//矩形高度 
};
int n;
node  m[100000];
int r[100000],l[100000];//记录举行的右端点和左端点 
long long ans[100000];
stack<node> t;
int main()
{

	while(cin>>n,n!=0)
	{
		for(int i=0;i<n;i++)
		{
			m[i].order=i;
			cin>>m[i].h;
		}
		    
		for(int i=0;i<n;i++)
		{
			while(!t.empty() && m[i].h<t.top().h)
        	{
				node temp=t.top();
				r[temp.order]=i;//记录对应的区间右端点 
				t.pop();
			}
        	t.push(m[i]);
        }
        //如果栈不为空,则说明栈中元素单调,所有元素的右端点均为n 
        while(!t.empty()) 
        {
        	node temp=t.top();
        	r[temp.order]=n;
        	t.pop();
		}
		for(int i=n-1;i>=0;i--)
		{
			while(!t.empty() && m[i].h<t.top().h)
        	{
				node temp=t.top();
				l[temp.order]=i;//记录对应的区间右端点 
				t.pop();
			}
        	t.push(m[i]);
        }
        //如果栈不为空,则说明栈中元素单调,所有元素的右端点均为n 
        while(!t.empty()) 
        {
        	node temp=t.top();
        	l[temp.order]=-1;
        	t.pop();
		}
		long long max=0;
		for(int i=0;i<n;i++)
		{
			ans[i]=m[i].h*(r[i]-l[i]-1);
			if(ans[i]>max)  max=ans[i];
		}
		cout<<max<<endl;
	}
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

栈求解最大矩形 的相关文章

  • hackmyvm Rei靶机练习

    主机发现端口扫描漏洞挖掘权限提升 主机发现 攻击机ip 靶机ip sn 发送arp请求包探测目标ip是否在线 端口扫描 p 所有端口扫描 sV 查询开放端口的服务 这里65333是ssh服务 xff0c 63777是http服务 最好拿个记
  • web中间件日志分析脚本3.0(shell脚本)

    新添功能保存的日志代码 新添功能 3 0版本加了ssrf 目录遍历文件包含 优化自动创建目录功能 一般使用1 6 7即可 3 1版本 框架漏洞检测 封面字体颜色改变 保存的日志 fi 目录遍历 sqli ssrf xss 代码 span c
  • nginx版本平滑升级(超详细)

    一 前期准备二 开始实验安装旧版本安装新版本 三 可能遇到的问题 文章背景 xff1a 护网期间 xff0c 客户跟我说nginx有0day漏洞 xff0c 需要版本升级 xff0c 我寻思着我也不是运维啊 xff0c 问我干嘛 xff08
  • AndroidStudio2021.3logcat工具无法显示日志解决办法

    我的AS版本 2021 3 日志没有任何输出 解决办法 1 File gt setting 2 搜索logcat xff0c 点击Experimental 3 把logcat对应的选项去掉 4 重启AS就可以看到日志信息
  • Ubuntu 20.04 安装mysql数据库教程

    1 首先安装mysql程序 命令 xff1a sudo apt install mysql server 2 安装完查看mysql启动状态 xff1a 命令 xff1a systemctl status mysql 3 直接使用root账户
  • 一文了解按位操作符中左移与右移

    无意中看到 gt gt lt lt gt gt gt 说实话一点也不知道这是什么 xff0c 带着好奇心去了解了一下 本文从一个小白的角度看这三个按位操作符的意思 xff0c 会相对好理解 按位操作符操作数字的二进制形式 xff0c 但是返
  • 2080Ti+win10+anaconda+pycharm+tensorflow-gpu(亲测有效)

    参考了很多方法 xff0c 发现一个非常智能的配置环境的方法 不用单独安装vc xff0c vs xff0c cuda xff0c cudnn xff0c 也不用考虑他们的版本搭配问题 xff0c 也不用环境变量的配置 可以通过不同的虚拟环
  • 乐维监控配置HTTPS访问教程

    前提条件 配置前需部署好的乐维监控系统 准备SSL证书 1 1 生成自签名证书 首先 xff0c 先生成自签名证书 这里提供一个快速生成证书的脚本 执行脚本需要输入一个IP或域名的参数 然后会在脚本所在目录下面生成名为ssl crt的证书和
  • Python tkinter布局与按钮间距设置

    新建label与button xff0c 并设置位置 xff08 grid xff09 import tkinter as tk root 61 tk Tk label 61 tk Label root text 61 Label labe
  • 程序设计思维与实践 - CSP - M2

    文章目录 程序设计思维与实践 CSP M2Problem A HRZ的序列DescriptionInputOutputSample InputSample OnputNoteIdeaCodes Problem B HRZ学英语Descrip
  • 程序设计思维与实践 Week8 作业

    文章目录 Problem A 区间选点 IIDescriptionInputOutputSample InputSample OnputNoteIdeaCodes Problem B 猫猫向前冲DescriptionInputOutputS
  • linux操作基础----系统管理

    linux操作基础 系统管理 基于之前三篇 xff1a linux基础操作之文件操作命令 linux基础操作之常用命令 linux基础操作之文件权限 xff0c 查找 xff0c 链接 继续总结linux的命令及操作 xff0c 本次对li
  • 可怕的宇宙射线

    题意 xff1a 宇宙射线会在无限的二维平面上传播 可以看做一个二维网格图 xff0c 初始方向默认向上 宇宙射线会在发射出一段距离后分裂 xff0c 向该方向的左右45 方向分裂出两条宇宙射线 xff0c 同时威力不变 宇宙射线会分裂n次
  • 平衡字符串问题

    题意 xff1a 一个长度为 n 的字符串 s xff0c 其中仅包含 Q W E R 四种字符 如果四种字符在字符串中出现次数均为 n 4 xff0c 则其为一个平衡字符串 现可以将 s 中连续的一段子串替换成相同长度的只包含那四个字符的
  • 买房问题

    题意 xff1a 蒜头君从现在开始工作 xff0c 年薪 NN 万 他希望在蒜厂附近买一套 6060 平米的房子 xff0c 现在价格是 200200 万 假设房子价格以每年百分之 KK 增长 xff0c 并且蒜头君未来年薪不变 xff0c
  • ubuntu 创建raid5教程

    1 查看磁盘 xff1a parted l 2 安装创建raid工具mdadm sudo apt install mdadm 3 创建命令 xff1a sudo mdadm Cv dev md0 l5 n3 dev sdb dev sdc
  • python+tesseract 训练和破解验证码(一)

    利用python及tesseract达到高效破解验证码的方式 xff0c 主要针对彩色背景 xff0c 包含数字 英文字母 xff0c 存在干扰性的简单验证码 前期准备 i window 10 ii python 3 8 iii tesse
  • SpringBoot项目启动不了, 控制台也没输出信息。就是什么反应也没有(已解决)

    1 启动项目 没反应界面 2 解决方法 File Settings Plugins groovy 去掉打勾的所有插件 3 启动成功
  • Django3.0入门【2】ORM关系模型:将model转入数据表

    采用ROM进行对象关系映射 O ObjectR relationM mapping 主要作用 xff1a 简化 SQL编写 xff0c 用对象的方式去替代 在 models py中生成models span class token keyw

随机推荐

  • 阿里云ECS服务器的搭建和部署

    一 购买服务器 1 首先要进行登录 xff0c 如果没有账号可以进行免费注册 xff0c 然后实名认证 xff0c 注册链接如下 xff1a 阿里云注册入口 阿里云注册入口 http www ccusoft com a htm 如下图所示
  • 记一次CentOS 8 部署packstack部署OpenStack失败案例,请直接看最后

    首先你需要一台安装好CentOS8 的虚拟机 xff0c 相关参数如图 两块网卡 xff0c 网卡1 NAT IP 192 168 100 100 GW 61 192 168 100 2 网卡2 可不做配置 能ping通百度 创建完成虚拟机
  • please ensure that VS 2013, VS 2015, VS 2017 or VS 2019 was installed with the Visual C++ option

    first rustup toolchain install stable x86 64 pc windows gnu then rustup default stable x86 64 pc windows gnu end cargo b
  • 顺序表函数

    include 34 Seq h 34 include lt stdlib h gt include lt stdio h gt 创建顺序表 Seq Create Seq s 61 Seq malloc sizeof Seq sizeof
  • Qt Creator中配置Opencascade

    Qt Creator中配置Opencascade 前言 xff1a 由于项目需要使用到STEP STP文件 xff0c 还需要三维建模 xff0c 于是就发现了一个工具 目前网上的资源 xff0c 专门分享这方面内容的是eryar大佬 xf
  • vs运行出错:error MSB8020或error LNK1104: 无法打开文件“opencv_calib3d248d.lib/opencv_contribxxxd.lib”

    error MSB8020 可能错误原因 xff1a 低版本的vs编译高版本的代码会出现这个错误 解决方式 xff1a 转换平台工具集 xff0c 如下 xff0c 改成自己有的 2 在菜单中依次选择 项目 gt 重定解决方案目标 让后F7
  • 倒水问题bfs解题思路

    题目 解题思路 倒水问题为隐式bfs问题 xff0c 初次见到无法马上想到利用bfs的思路解题 xff0c 但是弄清楚其中过程问题便可以引刃而解 此处可类比迷宫问题 flag数组标记两个水杯中的水量状态 xff0c bfs的终止条件即第二杯
  • 网页限制F12,接触教程

    开启右键菜单 document oncontextmenu 61 function return true 开启文字选择 document onselectstart 61 function return true 开启复制 documen
  • 区间覆盖问题-贪心求解

    题目 https vjudge net problem OpenJ Bailian 2376 题目大意 本题给定两个整数n和t xff0c n表示接下来会输入n段区间 xff0c t表示需要覆盖的区间为 1 t 题目要求利用输入的n段区间来
  • DDL问题-贪心算法

    题目 题目大意 本题给出了若干个任务的DDL和对应的分值 xff0c 要求得出最少扣分值 xff0c 也就是求出最大得分 在DDL前完成任务可以得分 xff0c 否则就不能 解题思路 本题与区间覆盖问题有一些相似之处 xff0c 因此在贪心
  • TT 的神秘礼物-二分答案

    题目 题目大意 题目给出了一个长度为N的数组cat xff0c 要求产生新数组ans xff0c 其中ans由所有abs cat i cat j 组成 xff0c 其中i j且1 i xff1c j N 要求求出ans排序后的中位数 xff
  • 【区间选点 II】差分约束

    题目 题意 给定一个数轴上的 n 个区间 xff0c 要求在数轴上选取最少的点使得第 i 个区间 ai bi 里至少有 ci 个点 使用差分约束系统的解法解决这道题 Input 输入第一行一个整数 n 表示区间的个数 xff0c 接下来的
  • 【东东学打牌】复杂模拟

    题目 题意 最近 xff0c 东东沉迷于打牌 所以他找到 HRZ ZJM 等人和他一起打牌 由于人数众多 xff0c 东东稍微修改了亿下游戏规则 xff1a 所有扑克牌只按数字来算大小 xff0c 忽略花色 每张扑克牌的大小由一个值表示 A
  • 【Max Sum Plus Plus】区间dp

    题目 HDU 1024 传送门 题意 东东每个学期都会去寝室接受扫楼的任务 xff0c 并清点每个寝室的人数 每个寝室里面有ai个人 1 lt 61 i lt 61 n 从第i到第j个宿舍一共有sum i j 61 a i 43 43 a
  • 【TT的奖励】动态规划

    题目 题意 在大家不辞辛劳的帮助下 xff0c TT 顺利地完成了所有的神秘任务 神秘人很高兴 xff0c 决定给 TT 一个奖励 xff0c 即白日做梦之捡猫咪游戏 捡猫咪游戏是这样的 xff0c 猫咪从天上往下掉 xff0c 且只会掉在
  • 【ZJM要抵御宇宙射线】CSP模测T2

    题目 题目大意 本题给出平面二维坐标上的若干个点 xff0c 要求选取一个点做圆心 xff0c 此时可以以最短半径包含所有点 xff0c 求出圆心坐标和最短半径平方 xff0c 结果保留两位小数 解题思路 本题乍看只下可能觉得会很复杂 xf
  • 【宇宙狗的危机】CSP模测T4

    题目 题目描述 在瑞神大战宇宙射线中我们了解到了宇宙狗的厉害之处 xff0c 虽然宇宙狗凶神恶煞 xff0c 但是宇宙狗有一 个很可爱的女朋友 最近 xff0c 他的女朋友得到了一些数 xff0c 同时 xff0c 她还很喜欢树 xff0c
  • 【猫睡觉问题】较复杂模拟

    题目 HDU 3700 Cat 题目大意 题目给出一只猫每天若干个时间段有任务 xff0c 没有任务时猫可以睡觉 题目还给出两个数A和B xff0c 表示猫每次睡觉时间不能少于A小时且每次醒着的时间不能多于B小时 题目要求输出一天猫可能睡觉
  • linux 部署django时报错django.core.exceptions.ImproperlyConfigured: mysqlclient 1.4.3 or newer is required

    1 在项目中 init py中这个报错原因 xff0c python 3 5以上版本不支持这种方式 from pymysql import install as MySQLdb install as MySQLdb 解决 xff1a imp
  • 栈求解最大矩形

    题目描述 给一个直方图 xff0c 求直方图中的最大矩形的面积 例如 xff0c 下面这个图片中直方图的高度从左到右分别是2 1 4 5 1 3 3 他们的宽都是1 xff0c 其中最大的矩形是阴影部分 Input 输入包含多组数据 每组数