【leetcode】leetcode221最大正方形的通过代码及题解

题目描述

在一个由 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]);其实就是每次计算以当前位置为右下角的最大正方形时,需要找到上面,左面,左上的三个位置中的较小值,因为只有这样才能得到当前的最大正方形。
每次都记录自己写的代码和网上的最优代码,希望以后再刷到这道题可以快速想到递推式,用最好的方法解决。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页