O(n)的方法,基于栈。参考http://www.geeksforgeeks.org/largest-rectangle-under-histogram/
int largestRectangleArea(vector<int> &height) {
vector<int> index;
int maxArea = 0;
for (int i = 0; i < height.size(); i++)
{
while (index.size() && height[i] <= height[index.back()])
maxArea = max(getArea(height, index, i), maxArea);
index.push_back(i);
}
while (index.size())
maxArea = max(getArea(height, index, height.size()), maxArea);
return maxArea;
}
int getArea(vector<int> &height, vector<int>& index, int start)
{
int areaH = height[index.back()];
index.pop_back();
int end = index.empty() ? -1 : index.back();
return (start - end - 1) * areaH;
}