题目:
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.
For example,
Given height = [2,1,5,6,2,3]
,
return 10
.
思路:
思路1: 两层循环,依次计算可能组成的方形面积。时间复杂度较高。 思路2: 一次遍历完成计算,从前一个方形遍历后一个方形时有三种情况。 1)前一个方形的高度等于后一个方形,显然应当取两者合并的面积。 2)前一个方形的高度小于后一个方形,可能取前一个方形与后一个方形组成的方形面积,也可能重后一个方形开始重新构造方形。 3)前一个方形的高度大于后一个方形,可能以后一个方形的面积向前取最大的方形面积。 由于要记录可能开始的方形位置与其高度,我采用了堆来实现。
代码:
思路1:
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
int max=0;
for(int i=0;i<height.size();i++)
{
for(int j=i;j<height.size();j++)
{
int cur = area(height, i, j);
if(cur > max)
max = cur;
}
}
}
int area(vector<int> &height, int i, int j)
{
return (height[i]<height[j]?height[i]:height[j])*(j-i+1);
}
};
思路2:
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
if(height.size()==0)
return 0;
stack<int> indexstack;
stack<int> heightstack;
int max=0;
indexstack.push(0);
heightstack.push(height[0]);
for(int i=1;i<height.size();i++)
{
int top = heightstack.top();
if(top < height[i])
{
indexstack.push(i);
heightstack.push(height[i]);
}
else if(top > height[i])
{
int index = i;
while(top>height[i])
{
index = indexstack.top();
int area = top*(i-index);
heightstack.pop();
indexstack.pop();
if(area>max)
max = area;
if(heightstack.size()==0)
break;
else
top = heightstack.top();
};
indexstack.push(index);
heightstack.push(height[i]);
}
}
while(heightstack.size()>0)
{
int h = heightstack.top();
heightstack.pop();
int index = indexstack.top();
indexstack.pop();
int area = h * (height.size()-index);
if(area>max)
max = area;
}
return max;
}
};