版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35508033/article/details/89062062
https://leetcode-cn.com/problems/maximal-square/
- 动态规划,问题转化成求最大正方形边长
- 建立二维矩阵dp[M][N]其中M, N分别为原二维矩阵的高和宽
- 矩阵中一点dp[i][j]表示以matrix[i][j]该点为右下角端点的最大正方形的变长,若matrix[i][j] == '0'则该端点无法构成正方形,记边长为0
- 矩阵中的每一个点作为正方形右下角端点所能构成最大正方形的边长,亦或是该点 左方、上方、左上方相邻端点所能构成最大正方形边长的最小值加1(该点为"1"),亦或为0(该点为0)
- 动态转移方程:
dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])+1 (该点为"1")
dp[i][j] = 0 (该点为"0")
public class Solution {
public int maximalSquare(char[][] matrix) {
if (matrix == null || matrix.length == 0
|| matrix[0].length == 0) {
return 0;
}
int m = matrix.length;
int n = matrix[0].length;
int[][] len = new int[m+1][n+1];
int max = 0;
for(int i=1; i<=m; i++) {
for(int j=1; j<=n; j++) {
if (matrix[i-1][j-1]=='1') {
len[i][j] = Math.min(len[i-1][j-1],
Math.min(len[i-1][j], len[i][j-1])) + 1;
}
max = Math.max(max, len[i][j]);
}
}
return max*max;
}
}