思路一:遍历每个立柱,以其高度左右扩展,找到左右第一个低于它的立柱,即为以它为高度的最大面积,时间复杂度是O(n^2)
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int area = 0;
for (int i = 0; i < heights.size(); ++i) {
int tmp = heights[i];
for (int j = i - 1; j >= 0; --j) {
if (heights[j] >= heights[i]) tmp += heights[i];
else break;
}
for (int j = i + 1; j < heights.size(); ++j) {
if (heights[j] >= heights[i]) tmp += heights[i];
else break;
}
area = max(area, tmp);
}
return area;
}
};
思路二:考虑一种递增的图形,如下图的5、6、7、8、3,对于这种图形,很容易算出以5、6、7、8为高度的最大面积,使用一个栈维护这种图形,时间复杂度为O(n)
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int i = 0, area = 0;
stack<int> s;
heights.push_back(0);
while (i < heights.size()) {
if (s.empty() || heights[i] > heights[s.top()]) s.push(i++);
else {
int t = s.top();
s.pop();
area = max(area, heights[t] * (s.empty() ? i : i - s.top() - 1));
}
}
return area;
}
};