84. Largest Rectangle in Histogram
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.

Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].

The largest rectangle is shown in the shaded area, which has area = 10 unit.
求最大矩形的面积
方法一:暴力来leetcode上也能通过,方法也非常的好理解,就是遍历到每一个高度,向左和向右遍历,找到低于该高度的边界顺便计算矩形的宽度,进而计算面积,最终找到面积的最大值。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
if(heights.size()==0){
return 0;
}
int maxArea=0;//设置初始值
for(int i=0;i<heights.size();i++){
int start=i,end=i+1;
while(start>=0 && heights[start]>=heights[i]){ //找到左边界
start--;
}
while(end<heights.size() && heights[end]>=heights[i]){ //找到右边界
end++;
}
maxArea=max(maxArea,heights[i]*(end-start-1)); //计算面积筛选最大值。
}
return maxArea;
}
};
方法二:借用栈来解决问题。维护一个非递减的栈,也就是高度非递减,[2,1,5,6,2,3],高度是非递减的,如下图所示,以B1为高度的矩形,开始位置也就是左边界,就是其本身,因为左边C1高度要比他低,所以不能计算。那怎么确定他的右边界呢,也就是矩形到什么停止呢,这就到了,不能产生非递减栈的那个高度,比如6后面的儿,2<6 不符合非递减栈的要求,这时候也是左边所有矩形结束的位置。这也解释了,为什么在数组的后面添加一个-1,因为要找到最后一个矩形结束的位置。

代码如下:
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
heights.push_back(-1); //添加到最后,是为了找到最后一个矩形的右边界
int max_size=0;
int index=0;
stack<int> s; //存储位置
while(index<heights.size())
{
if(s.size()==0||heights[s.top()]<=heights[index]) //维护非递减栈。
{
s.push(index);
index++;
}
else
{
int top=s.top(); //栈中高度最高的。
s.pop();
int size=0;
if(s.size()==0) //如果这个时候栈为空,说明到这个位置位置,都不符合非递减栈,所以前面的高度都比他高,所以他的宽度为index.
{
size=heights[top]*index;
}
else
{
//如果栈不为空,这个时候他的左边界就是栈顶,因为这个时候它本身已经pop.
size=heights[top]*(index-s.top()-1);
}
if(size>max_size) max_size=size; //计算面积
}
}
return max_size;
}
};
望批评指正。
431



被折叠的 条评论
为什么被折叠?



