【LeetCode-221】最大正方形

问题

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

解答

class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        int res = 0;
        int m = matrix.size(), n = matrix[0].size();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1));
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (matrix[i - 1][j - 1] != '1') continue;
                dp[i][j] = min(dp[i - 1][j], min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;
                res = max(res, dp[i][j]);
            }
        }
        return res * res;
    }
};

重点思路

dp递推公式的意义是,以当前位置为右下角的最大正方形,值为左、上、左上位置值的最小值加一。这里需要证明充分必要条件。

  • 充分条件:假设左、上、左上的dp值都为3,添加上当前位置后,画图能看出,能构成一个边长为4的正方形;
  • 必要条件:当前位置能构成一个边长为4的正方形时,易得左、上、左上的dp值都为3。
posted @ 2021-03-29 11:21  tmpUser  阅读(57)  评论(0)    收藏  举报