直方图最大矩阵面积

题目

给定一个直方图,求这个直方图中最大矩阵对应的面积是多少?
比如有个图如下 (对应的数组为:[2,1,5,6,2,3])
在这里插入图片描述
那么对应的最大矩形的面积应该为 10:
在这里插入图片描述

使用单调栈可以使时间复杂度为O(N)
分别以数组中的每个元素作为边,确定其对应矩阵的大小
如2 对应矩阵大小为2
1对应矩阵大小为6
5对应矩阵大小为10
6应矩阵大小为6
2对应矩阵大小为8
3对应矩阵大小为3
最大值即为解
方法:栈采用升序。遍历数组,栈为空,直接入栈,大于栈顶元素直接入栈,等于栈顶元素,使用链表在栈顶后面追加。小于栈底元素,则可以确定以栈顶为边的矩阵大小,因为栈顶下面的一个元素一定比它小,而新加入的元素也是。
遍历结束,栈不为空,栈顶和栈底构成的矩阵宽为1

int maxarea(vector<int>&obj){
	stack<list<int>>help;
	int ret = 0;
	for (int i = 0; i < obj.size(); i++){
		while (!help.empty() && obj[i] < obj[help.top().back()]){
			int temp = help.top().front();
			help.pop();
			int left = help.empty() ? -1 : help.top().back();
			int ret_temp = obj[temp] * (i - left - 1);
			ret = ret>ret_temp ? ret : ret_temp;
		}
		if (!help.empty()&&obj[i] < obj[help.top().back()])
		//这里一定不要漏了!help.empty()
			help.top().push_back(i);
		else{
			list<int>l;
			l.push_back(i);
			help.push(l);
		}
	}
	while (!help.empty()){
		int temp = help.top().front();
		help.pop();
		int left = help.empty() ? -1 : help.top().back();
		int ret_temp = obj[temp] * (obj.size() - left - 1);
		ret = ret>ret_temp ? ret : ret_temp;
	}
	return ret;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值