给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
heights.push_back(-1);
stack<int> picLeftStack;
stack<int> picRightStack;
vector<int> width;
for (int curIndex = 0; curIndex < heights.size(); curIndex++)
{
width.push_back(0);
}
int ans = 0;
for (int curIndex = 0; curIndex < heights.size(); curIndex++)
{
if (picLeftStack.empty() || heights[picLeftStack.top()] <= heights[curIndex])
{
picLeftStack.push(curIndex);
}
else
{
while (!picLeftStack.empty() && heights[picLeftStack.top()] > heights[curIndex])
{
int popIndex = picLeftStack.top();
picLeftStack.pop();
width[popIndex] = curIndex - popIndex;
}
picLeftStack.push(curIndex);
}
}
heights.pop_back();
for (int curIndex = heights.size() - 1; curIndex >= 0; curIndex--)
{
if (picRightStack.empty() || heights[picRightStack.top()] <= heights[curIndex])
{
picRightStack.push(curIndex);
}
else
{
while (!picRightStack.empty() && heights[picRightStack.top()] > heights[curIndex])
{
int popIndex = picRightStack.top();
picRightStack.pop();
width[popIndex] += popIndex - curIndex - 1;
}
picRightStack.push(curIndex);
}
}
while (!picRightStack.empty())
{
int popIndex = picRightStack.top();
picRightStack.pop();
width[popIndex] += popIndex;
}
for (int curIndex = 0; curIndex < heights.size(); curIndex++)
{
int area = heights[curIndex] * width[curIndex];
if (area > ans)
{
ans = area;
}
}
return ans;
}
};