题目描述
在一个由 0 和 1 组成的二维矩阵内,找到只包含 1 的最大正方形,并返回其面积。
示例:
输入:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
输出: 4
通过的代码
(1)我的代码
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int row=matrix.size();
if(row==0)
return 0;
int col=matrix[0].size();
int dp[row+10][col+10];
int ans;
int anss;
int mid;
int flag;
ans=matrix[0][0]-'0';
for(int i=0;i<row;i++)
{
dp[i][0]=matrix[i][0]-'0';
if(dp[i][0]>ans)
ans=dp[i][0];
}
for(int j=0;j<col;j++)
{
dp[0][j]=matrix[0][j]-'0';
if(dp[0][j]>ans)
ans=dp[0][j];
}
for(int i=1;i<row;i++)
for(int j=1;j<col;j++)
{
mid=dp[i-1][j-1];
dp[i][j]=matrix[i][j]-'0';
if(mid!=0&&matrix[i][j]!='0')
{
for(int k=1;k<=mid;k++)
{
flag=1;
for(int m=1;m<=k;m++)
{
if(matrix[i-m][j]=='0'||matrix[i][j-m]=='0')
{
flag=0;
break;
}
}
if(flag==1)
dp[i][j]=max(k+1,dp[i][j]);
}
}
if(dp[i][j]>ans)
ans=dp[i][j];
}
anss=ans*ans;
return anss;
}
};
(2)网上最优的代码
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int row=matrix.size();
if(row==0)
return 0;
int col=matrix[0].size();
int dp[row+10][col+10];
int ans=0;
int anss;
for(int i=0;i<=row;i++)
for(int j=0;j<=col;j++)
{
dp[i][j]=0;
}
for(int i=1;i<=row;i++)
for(int j=1;j<=col;j++)
{
if(matrix[i-1][j-1]!='0')
{
dp[i][j]=1+min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]));
if(dp[i][j]>ans)
ans=dp[i][j];
}
}
anss=ans*ans;
return anss;
}
};
解题思路
这个题目,刚开始看到,我就觉得是用动态规划来解决,但是我自己在实现的时候没有想清楚动态规划的递推式。所以按照自己的想法做,就发现总是有一部分测试样例无法通过,因为还是没有考虑周全。最后好不容易通过了所有的样例,发现自己的代码耗费的时间还是比较长。所以就去搜了别人的解法,果然是有一个递推式,感觉动态规划的题目只要把递推式想清楚了就很好解决了。以dp[i][j]表示以第i行第j列为右下角所能构成的最大正方形边长, 则递推式为: dp[i][j] = 1 + min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]);其实就是每次计算以当前位置为右下角的最大正方形时,需要找到上面,左面,左上的三个位置中的较小值,因为只有这样才能得到当前的最大正方形。
每次都记录自己写的代码和网上的最优代码,希望以后再刷到这道题可以快速想到递推式,用最好的方法解决。