题目
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
输入:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
输出: 4
分析
最大正方形,我们要知道以点(i,j)为右下角的最大正方形其与左上角、左边以及上边点组成的正方形有关,其关系是:如果此格是1,以此为右下角的正方形的最大边长为:上面的正方形、左面的正方形或左上的正方形中,最小的那个,再加上此格。
如图所示:
图片来自
dp[i+1][j+1]代表的是以点(i,j)为右下角的正方形的最大边长值
则递推公式为: dp[i+1][j+1]=min(dp[i][j],min(dp[i][j+1],dp[i+1][j]))+1;
如果使用dp[i][j]代表的是以点(i,j)为右下角的正方形的最大边长值,那么递推公式就会有i-1和j-1出现,此时当i或者j等于0,其dp就不在区间内。
因为求最大的动态规划问题,所以初始值初始化为0,初始矩阵是(m+1)×(n+1)
代码
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
if(matrix.empty())//矩阵为空
{
return 0;
}
int m=matrix.size();
int n=matrix[0].size();
vector<vector<int>> dp(m+1,vector<int>(n+1,0));//求最大,所以初始赋值为0
int ans=0;//正方形的边长值
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(matrix[i][j]=='0')
{
continue;
}
dp[i+1][j+1]=min(dp[i][j],min(dp[i][j+1],dp[i+1][j]))+1;
//dp[i+1][j+1]代表的是以点(i,j)为右下角的最大边长值,为什么不使用dp[i][j]表示
ans=max(ans,dp[i+1][j+1]);
}
}
return ans*ans;
}
};