这题和上一道求最大矩形有些相同点,核心思想都一样,最大矩形一定是某一列向左右扩展可得。
不用动态规划则是O(N^2)时间复杂度,用动态规划是O(N)线性时空复杂度。
L[i]表示第i列向左扩展后最左位置,R[i]为向右。则R[i]-L[i]+1为第i列扩展后的宽度。
class Solution {
public:
int largestRectangleArea(vector<int> &height) {
int res = 0;
if(height.size()==0)
return 0;
int n = height.size();
vector<int> L(n);
vector<int> R(n,n-1);
for(int i=1;i<n;++i){
if(height[i]>height[i-1])
L[i] = i;
else{
int left = L[i-1];
while(left>0 && height[left-1]>=height[i]){
left = L[left-1];
}
L[i] = left;
}
}
for(int j=n-2;j>=0;--j){
if(height[j]>height[j+1])
R[j] = j;
else{
int right = R[j+1];
while(right<n-1 && height[right+1]>=height[j]){
right = R[right+1];
}
R[j] = right;
}
}
for(int i=0;i<n;++i){
res = max(res,(R[i]-L[i]+1)*height[i]);
}
return res;
}
};