题目:
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 =10unit.
For example,
Given height =[2,1,5,6,2,3],
return10.
程序:
方法一:
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
if(height.size()==0)
return 0;
if(height.size()==1)
return height[0];
int len=height.size();
vector<int> dp(len,0);
for(int i=0;i<len;i++)
{
if(i==0)
{
int j=i;
int count=0;
while(j<len&&height[i]<=height[j])
{
count++;
j++;
}
dp[i]=count*height[i];
}
else if(i==len-1)
{
int j=i;
int count=0;
while(j>=0&&height[i]<=height[j])
{
count++;
j--;
}
dp[i]=count*height[i];
}
else
{
int j=i;
int count=0;
while(j<len&&height[i]<=height[j])
{
count++;
j++;
}
j=i;
while(j>=0&&height[i]<=height[j])
{
count++;
j--;
}
dp[i]=(count-1)*height[i];
}
}
int res=0;
for(int i=0;i<dp.size();i++)
if(dp[i]>res)
res=dp[i];
return res;
}
};
方法二:
使用堆栈 O(n)
/*
用堆栈计算每一块板能延伸到的左右边界
对每一块板
堆栈顶矮,这一块左边界确定,入栈
堆栈顶高,堆栈顶右边界确定,出栈,计算面积
入栈时左边界确定
出栈时右边界确定
堆栈里元素是递增的
本质:中间的短板没有用!
复杂度 O(n)
*/
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
int n=height.size(),result=0;
stack<int> s;
for(int i=0;i<n;++i){
while((!s.empty())&&(height[s.top()]>=height[i])){
int h=height[s.top()];
s.pop();
result=max(result,(i-1-(s.empty()?(-1):s.top()))*h);
}
s.push(i);
}
while(!s.empty()){
int h=height[s.top()];
s.pop();
result=max(result,(n-1-(s.empty()?(-1):s.top()))*h);
}
return result;
}
};