数据结构:单调栈——矩形面积例题

**

单调栈的基础运用

**
在这里插入图片描述
首先看题目。
这是一道经典的模板题目。用来训练我们的单调栈。那么我们为什么会想到以单调栈来解决这道题呢?
我们先画图分析:
在这里插入图片描述
可以看到,由于n的范围太大导致一般的结构会超时。
我们的推理从特殊到一般,从中寻找方法途径。
在这里插入图片描述
这是理想化模型,那么推广到一般形式呢?
在这里插入图片描述
这样我们就找到了使用单调栈的依据。
在这里插入图片描述
以上就是基本的算法思考过程和思路,代码实现上需要综合考虑,使得我们的时间控制在O(n)。
这里我的选择是使用数组模拟栈,这是根据本题的特性决定的。
看代码:(头文件自己加)

using namespace std;
long long int a[1000005];
long long int highmi[1000005],w[1000005],maxx[1000005]={0};

int main()
{

	long long int x,y,h=0;
	while(scanf("%lld",&x))
	{
		if(x!=0)
		{
		long long int p;
		for(long long int e=1;e<=x;e++)
		{
			scanf("%lld",&y);
			a[e]=y;
		}
		a[x+1]=0;
		p=0;
		for(long long int r=1;r<=x+1;r++)
		{
			if(a[r]>highmi[p])
			{
				highmi[++p]=a[r];
				w[p]=1;
			}
			else 
			{
				long long  width=0;
				while(highmi[p]>a[r])
				{
					width+=w[p];
					maxx[h]=max(maxx[h],width*highmi[p]);
					p--;
				}
				highmi[++p]=a[r],w[p]=width+1;
			}
		}
		h++;
		}
		else break;
	}
	for(int r=0;r<h;r++)
	{
		if(r<h-1)
		cout<<maxx[r]<<endl;
		else cout<<maxx[r];
	}
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值