给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
思路1#
保留求解。使用两层循环,外层循环为 i,内层循环为 j,j>=i,计算 [i, j] 范围内的最大面积。代码如下:
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
if(heights.empty()) return 0;
int maxArea = -1;
for(int i=0; i<heights.size(); i++){
int minHeight = INT_MAX; // [i, j]范围内柱子的最低高度
for(int j = i; j<heights.size(); j++){
minHeight = min(heights[j], minHeight); //最低高度的计算很重要
maxArea = max(minHeight*(j-i+1), maxArea);
}
}
return maxArea;
}
};
// 超时,该方法超时未通过。
时间复杂度:O(n^2)
空间复杂度:O(1)
思路2#
遍历数组,当遍历到 i 时,从 i 开始向两边寻找不小于 height[i] 的元素,然后求面积即可,记录最大的面积作为答案。代码如下:
Copy
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
if(heights.empty()) return 0;
int maxArea = -1;
for(int i=0; i<heights.size(); i++){
int curHeight = heights[i];
int left = i, right = i;
while(left>=0 && heights[left]>=curHeight) left--;
while(right<heights.size() && heights[right]>=curHeight) right++;
maxArea = max(curHeight*(right-left-1), maxArea); // (right-1)-(left+1)+1=right-left-1
}
return maxArea;
}
};
// 超时
时间复杂度:O(n^2)
空间复杂度:O(1)