2018-09-13 19:19:44
问题描述:
问题求解:
方法一:
使用动态规划来求解,算法时间复杂度O(n^2)。
dp[i][j] : 以(i, j)为右下角的面积最大的正方形的边长。
初始条件:最上面一行,最左边一列,可以直接得到dp值。
更新公式:matrix[i][j] == '0' - > dp[i][j] = 0
matrix[i][j] == '1' - > dp[i][j] = min(dp[i - 1][j], dp[i - 1][j - 1], dp[i][j - 1]) + 1
public int maximalSquare(char[][] matrix) { if (matrix.length == 0 || matrix[0].length == 0) return 0; int m = matrix.length; int n = matrix[0].length; int res = 0; int[][] dp = new int[m][n]; for (int i = 0; i < n; i++) { if (matrix[0][i] == '1') { dp[0][i] = 1; res = 1; } else dp[0][i] = 0; } for (int i = 0; i < m; i++) { if (matrix[i][0] == '1') { dp[i][0] = 1; res = 1; } else dp[i][0] = 0; } for (int i = 1; i < m; i++) { for (int j = 1; j < n; j++) { if (matrix[i][j] == '0') dp[i][j] = 0; else { dp[i][j] = Math.min(dp[i][j - 1], Math.min(dp[i - 1][j], dp[i - 1][j - 1])) + 1; res = Math.max(res, dp[i][j]); } } } return res * res; }