LeetCode 221
https://leetcode.cn/problems/maximal-square/description/
难度:中等
二维 DP,状态转移方程如下,并在计算 f 数组的时候维护正方形边长的最大值。
f[i + 1][j + 1] = min({f[i + 1][j], f[i][j + 1], f[i][j]}) + 1;
时间复杂度:O(mn),其中 m 和 n 是矩阵的行数和列数。需要遍历原始矩阵中的每个元素计算 dp 的值。
空间复杂度:O(mn),其中 m 和 n 是矩阵的行数和列数。创建了一个和原始矩阵大小相同的矩阵 dp。由于状态转移方程中的 dp(i,j) 由其上方、左方和左上方的三个相邻位置的 dp 值决定,因此可以使用两个一维数组进行状态转移,空间复杂度优化至 O(n)。
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int m = matrix.size(), n = matrix[0].size();
vector f(m + 1, vector<int>(n + 1, 0));
int mx = 0;
f[0][1] = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == '1') {
f[i + 1][j + 1] =
min({f[i + 1][j], f[i][j + 1], f[i][j]}) + 1;
mx = max(mx, f[i + 1][j + 1]);
}
}
}
return mx * mx;
}
};