1. 暴力
先遍历一遍矩阵,dp[i][j]表示以(i,j)这个点为右端点的最长宽度。得到宽度以后,我们只需寻找高度即可。方法是向上搜索。
所以复杂度为n*m*m。非常暴力的算法。
class Solution {
public:
int maximalRectangle(vector<vector<char>>& matrix) {
int m=matrix.size();
if(m==0) return 0;
int n=matrix[0].size();
int dp[m+3][n+3];
memset(dp,0,sizeof(dp));
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(matrix[i-1][j-1]=='1')
{
dp[i][j]=dp[i][j-1]+1;
}
}
}
int M=0;
int ans=0;
for(int j=1;j<=n;j++)
{
for(int i=1;i<=m;i++)
{
if(matrix[i-1][j-1]=='1')
{
int tmp=dp[i][j];
int len=1;
M=max(M,tmp*len);
for(int k=i-1;k>=1;k--)
{
if(matrix[k-1][j-1]=='1')
{
len++;
tmp=min(tmp,dp[k][j]);
M=max(M,tmp*len);
}
else
{
break;
}
}
}
}
}
return M;
}
};