寻找直方图中的最大矩形 Largest Rectangle in Histogram

142 篇文章 20 订阅
51 篇文章 0 订阅

题目:Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.For example,Given height = [2,1,5,6,2,3],return 10.

思路:矩形的高度瓶颈在于最小的高度。顺序扫描数组元素,同时在栈中维护一个递增的序列。当栈为空或是遇到比栈顶元素大的元素时,则认为瓶颈还未到来,只入栈而不计算;当遇到比栈顶元素小的元素时,则认为到达一个瓶颈,则对瓶颈左侧的矩形进行清算。

当扫描完毕后,再对栈中遗留下的元素进行清算。 

该方法的时间复杂度O(N),空间复杂度O(N)。

class Solution {
	public:
		int max(int a, int b)
		{
			if(a > b)
				return a;
			else
				return b;
		}
		int largestRectangleArea(vector<int> &height) {
			stack<int> s; //注意栈中存的是下标
			int len = height.size();
			int maxs = 0;
			int k;
			for(int i=0; i<len; i++)
			{
				if(s.empty() || height[s.top()] <= height[i])
					s.push(i);
				else
				{
					while(!s.empty() && height[s.top()] > height[i])
					{
						k = s.top();
						s.pop();
						if(s.empty()) //注意时刻防止栈为空
							maxs = max(maxs, i*height[k]);
						else
							maxs = max(maxs, (i-s.top()-1)*height[k]);
					}
					s.push(i);
				}
			}
			while(!s.empty())
			{
				k = s.top();
				s.pop();
				if(s.empty()) //注意时刻防止栈为空
					maxs = max(maxs, len*height[k]);
				else
					maxs = max(maxs, (len-s.top()-1)*height[k]);
			}
			return maxs;
		}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值