class Solution {
public:
int maximalSquare(vector<vector<char>>& mat) {
int m = mat.size(), n = mat[0].size(), max_width = 0;
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 (mat[i - 1][j - 1] == '1') {
dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1;
}
max_width = max(max_width, dp[i][j]);
}
}
return max_width * max_width;
}
};
可以使用动态规划降低时间复杂度。我们用 dp(i,j) 表示以 (i,j) 为右下角,且只包含 1 的正方形的边长最大值。如果我们能计算出所有 dp(i,j) 的值,那么其中的最大值即为矩阵中只包含 1 的正方形的边长最大值,其平方即为最大正方形的面积。
作者:LeetCode-Solution 链接:https://leetcode.cn/problems/maximal-square/solution/zui-da-zheng-fang-xing-by-leetcode-solution/
[1277. 统计全为 1 的正方形子矩阵](https://qiekn.notion.site/1277-1-7bb077e38fa64c4ea58ed54840a76248)
(m + 1) * (n + 1) 我有说法