[牛客竞赛] 小A的柱状图(单调栈模板题)

该博客介绍了如何运用单调栈解决一个关于寻找非规范柱状图中最大矩形面积的问题。通过分析输入输出描述,提供了一个样例及解决方案,解释了单调栈如何帮助找到左右边界,并计算出最大面积。最后,给出了实现该算法的代码片段。
摘要由CSDN通过智能技术生成

链接:https://ac.nowcoder.com/acm/contest/549/H
来源:牛客网

题目描述

柱状图是有一些宽度相等的矩形下端对齐以后横向排列的图形,但是小A的柱状图却不是一个规范的柱状图,它的每个矩形下端的宽度可以是不相同的一些整数,分别为a[i],每个矩形的高度是h[i],现在小A只想知道,在这个图形里面包含的最大矩形面积是多少。
在这里插入图片描述

输入描述:

一行一个整数N,表示长方形的个数
接下来一行N个整数表示每个长方形的宽度
接下来一行N个整数表示每个长方形的高度

输出描述:

一行一个整数,表示最大的矩形面积

输入

7
1 1 1 1 1 1 1
2 1 4 5 1 3 3

输出

8

说明

样例如图所示,包含的最大矩形面积是8

备注: 1 ≤ n ≤ 1e6, 1 ≤ a[i] ≤ 100, 1 ≤ h[i] ≤ 1e9



分析:

学会了单调栈这个很巧妙的东西 (感谢)——> https://blog.csdn.net/wubaizhe/article/details/70136174

  • 利用单调栈,可以找到从左/右遍历第一个比它小/大的元素的位置,时间复杂度O(N)

思路很简单,就是维护栈内的单调性,举例说明:有数组a[n+1](内有n个数据)

  1. 求L[n+1],L[i]表示向左遍历的第一个比 a[i] 小的数( 的下标 )
stack<int> s;
for(int i=1;i<=n;i++)      //向左遍历
{
   
	while(!s.empty()&&a[s.top()]>=a[i])    //找到栈中第一个 a[i]小的数
		s.pop();                       
	if(s.empty())      //若栈为空,说明左边没有比a[i]小的数
		L[i]=0;
	else                    
		L[i]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值