思路:
1. 以 下标(0, 0) 为正方形右下角,由于其值为'1', 所以它可以组成一个正方形, 边长为1
2. 以下标(0, 1) 为正方形右下角,由于其值为'0', 无法组成一个正方形, 边长为0
3. 以下标(0, 2) 为正方形右下角,......其边长为1
4. (0, 3) -> 边长为0; (0, 4) -> 边长为0
5. 以(1, 0) 为右下角, 边长为1
6. 以(1, 1) 为右下角, 边长为 0
7. 以(1, 2) 为右下角, 观察能否与其左方, 上方, 左上方方格构成正方形, 其边长为:
min (1, 0, 0) + 1 = 1
... 依此类推
class Solution {
public:
int maximalSquare(vector<vector<char>>& matrix) {
int rows = matrix.size();
int cols = matrix[0].size();
if (rows == 0 || cols == 0) return 0;
int maxMatrix = 0;
vector<vector<int>> dp(rows, vector<int>(cols));
for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
if (matrix[i][j] == '1') {
if (i == 0 || j == 0) {
dp[i][j] = 1;
} else {
int minV = dp[i - 1][j - 1];
if (dp[i][j - 1] < minV) minV = dp[i][j - 1];
if (dp[i - 1][j] < minV) minV = dp[i - 1][j];
dp[i][j] = minV + 1;
}
maxMatrix = max(maxMatrix, dp[i][j]);
} else {
dp[i][j] = 0;
}
}
}
int maxSequence = maxMatrix * maxMatrix;
return maxSequence;
}
};