85. 最大矩形
思路:枚举每一个点,作为矩阵的右下角。通过数组sta来记录矩阵的宽度w,再来一层for循环遍历高度h。细节看注释
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
int n=matrix.size(),m=matrix[0].size();
//数组sta[i][j]是用来记录第i行,从第j列往前算,有多少个连续的1
vector<vector<int>> sta(n,vector<int>(m,0));
//记录最大的矩阵
int mx=0;
//第一层for循环遍历每一行
for(int i=0;i<n;i++){
//第二层for循环遍历每一列
for(int j=0;j<m;j++){
//当前矩阵的右下角为0,直接不成立
if(matrix[i][j]=='0') continue;
//更新数组sta[i][j]的值
if(j!=0) sta[i][j]=sta[i][j-1]+1;
else sta[i][j]=1;
//当矩阵的行为1时。
mx=max(mx,sta[i][j]);
//记录下矩阵的宽度w;
int lens=sta[i][j];
//遍历矩阵的高度h
for(int k=i-1;k>=0;k--){
//当前点为‘0’就结束高度的遍历了
if(sta[k][j]==0) break;
//新矩阵的宽度w是会发生变化的
lens=min(lens,sta[k][j]);
//更新最大矩阵的情况
mx=max(mx,lens*(i-k+1));
}
}
}
return mx;
}
};