暴力法:枚举所有的矩形,时间复杂度O(n^3)
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
// 暴力方法:枚举矩形的所有左右端点,时间复杂度是O(N^3)
int res = 0;
for(int i=0;i<heights.size();i++){
for(int j=i;j<heights.size();j++){
int height = heights[i];
for(int k=i;k<=j;k++){
height = min(height,heights[k]);
}
res = max(res,(j-i+1)*height);
}
}
return res;
}
};
这个算法很容易优化到O(n^2)
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
// 暴力方法:枚举矩形的所有左右端点,时间复杂度是O(N^3)
int res = 0;
for(int i=0;i<heights.size();i++){
int height = heights[i];
for(int j=i;j<heights.size();j++){
height = min(height,heights[j]);
res = max(res,(j-i+1)*height);
}
}
return res;
}
};
还是超时,所以我们需要一个O(N)的算法:即一次遍历: