leetcode-221.最大正方形

动态规划(dp)


题目详情

在一个由 '0' '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。


示例1:

1

输入:matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出:4

示例2:

2

输入:matrix = [["0","1"],["1","0"]]
输出:1

思路:
对于在矩阵内搜索正方形或长方形的题型,一种常见的做法是定义一个二维 dp 数组,其中
dp[i][j] 表示满足题目条件的、以(i, j)为右下角的正方形或者长方形的属性。
本题我们用dp[i][j]表示以第i行第j列为右下角的正方形的最大边长,对于dp[i][j],是否能和dp[i-1][j](左边)
dp[i][j-1](上边)
dp[i-1][j-1](左上角)
构成一个更大的正方形,取决于这三者的最小值,dp[i][j]即为三者最小值加一

我的代码:

class Solution 
{
public:
    int maximalSquare(vector<vector<char>>& matrix) 
    {
        if (matrix.empty() || matrix[0].empty())
        return 0;
        
        int m = matrix.size(), n = matrix[0].size(), max_side = 0;
        vector<vector<int>> dp(m + 1, vector<int> (n + 1, 0));  //将所有dp初始化为0
        //dp[i][j]表示第i行第j列(matrix[i-1][j-1])为右下角的最大正方形的边长 (dp和matrix下标相差一)
        for (int i = 1; i <= m; ++i)
        {
            for (int j = 1; j <= n; ++j)
            {
                if (matrix[i-1][j-1] == '1')
                dp[i][j] = min(min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1;  //因为min参数只有两个,所以这样写

                max_side = max(max_side, dp[i][j]);
            }
        }
        return max_side*max_side;
    }
};

涉及知识点:

1.动态规划(dp)

动态规划

posted @ 2022-04-21 10:53  ggaoda  阅读(2)  评论(0编辑  收藏  举报  来源