java
class Solution {
public int maximalSquare(char[][] matrix) {
int row = matrix.length;
int col = matrix[0].length;
int[][] pref = new int[row + 1][col + 1];
for (int i = 1; i < row + 1; i++) {
for (int j = 1; j < col + 1; j++) {
pref[i][j] = matrix[i - 1][j - 1] - '0' + pref[i - 1][j] + pref[i][j - 1] - pref[i - 1][j - 1];
}
}
int maxSide = 0;
for (int i = 1; i < row + 1; i++) {
for (int j = 1; j < col + 1; j++) {
for (int k = maxSide + 1; i - k >= 0 && j - k >= 0; k++) {
int sum = pref[i][j] - pref[i - k][j] - pref[i][j - k] + pref[i - k][j - k];
if (sum == k * k)
maxSide = k;
}
}
}
return maxSide * maxSide;
}
}
在力扣中,这道题的最优解是动态规划(O(MN) 时间和 O(N) 空间),但前缀和方法对于解决"任意子矩形求和"类问题是通用的大杀器,非常值得掌握。
java
public int maximalSquare(char[][] matrix) {
int rows = matrix.length, cols = matrix[0].length;
int[][] dp = new int[rows + 1][cols + 1];
int maxSide = 0;
for (int i = 1; i <= rows; i++) {
for (int j = 1; j <= cols; j++) {
if (matrix[i-1][j-1] == '1') {
// 状态转移方程
dp[i][j] = Math.min(Math.min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1;
maxSide = Math.max(maxSide, dp[i][j]);
}
}
}
return maxSide * maxSide;
}