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 =10unit.
For example,
Given height =[2,1,5,6,2,3],
return10.
//N(n2)
class Solution {
public:
int largestRectangleArea(vector<int> &height)
{
int curmax = 0;
for (int i=0;i<height.size();i++)
{
int curmin = height[i];//当前序列最小倿
for(int j=i;j<height.size();j++)
{
if(height[j]<curmin)
curmin = height[j];
int tmp = curmin*(j-i+1);
curmax = tmp>curmax?tmp:curmax;
}
}
return curmax;
}
};
//O(n)
class Solution {
public:
int largestRectangleArea(vector<int> &height)
{
height.push_back(0);
int len = height.size();
stack<int> s;
s.push(0);
int curmax = 0;
for (int i=1;i<len;i++)
{
if (s.empty())
{
s.push(i);
cout<<"push :"<<i<<endl;
}
else
{
if (height[i] >= height[s.top()])
{
s.push(i);
cout<<"push :"<<i<<endl;
}
else
{
while(!s.empty())
{
if (height[i] < height[s.top()])
{
int temp=s.top();
cout<<"pop :"<<s.top()<<endl;
s.pop();
int tmp = height[temp]*(s.empty()?i:(i-s.top()-1));
cout<<height[temp]<<" "<<(s.empty()?i:(i-s.top()-1))<<" "<<curmax<<endl;
curmax = curmax>tmp?curmax:tmp;
}
else
break;
}
s.push(i);//将非递增的i入栈
}
}
}
return curmax;
}
};
//对上一个优化代砿
class Solution {
public:
int largestRectangleArea(vector<int> &height)
{
height.push_back(0);
int len = height.size();
stack<int> s;
s.push(height[0]);
int curmax = 0;
for (int i=1;i<len;i++)
{
if (s.empty() || height[i] >= height[s.top()])
s.push(i);
else
{
int temp=s.top();
s.pop();
int tmp = height[temp]*(s.empty()?i:(i-s.top()-1));
curmax = curmax>tmp?curmax:tmp;
i--;
}
}
return curmax;
}
};