该问题最优时间复杂度:O(N*M)
首先引入前缀和的思路,height表示以当前行标为截止,最长向上连续1的个数。
由于是求子矩阵,在处理前缀和后,每行独立处理,可以维护
left,当前高度的左边界
right,当前高度右边届
height,当前高度
接下来就是如何在O(M)时间维护这三个数组。
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
int N = matrix.size();
if(N == 0) return 0;
int M = matrix[0].size();
if(M == 0) return 0;
int height[M],right[M],left[M];
for(int i=0;i<M;i++){height[i]=left[i]=0;right[i]=M;}
int ans = 0;
for(int i=0;i<N;i++){
int now_left = 0;
int now_right = M;
for(int j=0;j<M;j++){
if(matrix[i][j] == '1'){
height[j] ++;
left[j] = max(left[j],now_left);
}else{
now_left = j+1;
height[j] = 0;
left[j] = 0;
}
}
for(int j=M-1;j>=0;j--){
if(matrix[i][j] == '1'){
right[j] = min(right[j],now_right);
}else{
now_right = j;
right[j] = M;
}
ans = max(ans,(right[j]-left[j])*height[j]);
}
}
return ans;
}
};