暴力法:枚舉所有的矩形,時間複雜度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)的算法:即一次遍歷: