法一(动态规划)
/**
* 法一(动态规划)
* 1. 思路
* (1)确定dp数组以及下标的含义
* dp[i][j]表示以第i行第j列为右下角所能构成的最大正方形边长
* (2)确定递推公式
* dp[i][j] = 1 + min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1])
* (3)确定dp数组如何初始化
* dp数组的大小初始化为rowSize+1行,colSize+1列
* (4)确定遍历顺序
* 从第1行第1列开始,按从左到右,从上到下的顺序遍历
* 2. 理解
* (1)原始数据
* 1 1 1 1 1
* 1 1 1 1 1
* 1 1 1 1 1
* 1 1 1 1 1
* (2)dp矩阵
* 1 1 1 1 1
* 1 2 2 2 2
* 1 2 3 3 3
* 1 2 3 4 4
*
* @param matrix
* @return
*/
public int maximalSquare(char[][] matrix) {
int rowSize = matrix.length;
if (rowSize < 1) {
return 0;
}
int colSize = matrix[0].length;
int max = 0;
int[][] dp = new int[rowSize + 1][colSize + 1];
for (int row = 1; row <= rowSize; row++) {
for (int col = 1; col <= colSize; col++) {
if (matrix[row - 1][col - 1] == '1') {
dp[row][col] = 1 + Math.min(dp[row - 1][col - 1], Math.min(dp[row - 1][col], dp[row][col - 1]));
max = Math.max(max, dp[row][col]);
}
}
}
return max * max;
}
本地测试
/**
* 221. 最大正方形
*/
lay.showTitle(221);
Solution221 sol221 = new Solution221();
char[][] matrix221 = new char[][]{{'1', '0', '1', '0', '0'}, {'1', '0', '1', '1', '1'}, {'1', '1', '1', '1', '1'}, {'1', '0', '0', '1', '0'}};
arrayOpt.showCharTwoDimArray(matrix221, matrix221.length);
System.out.println(sol221.maximalSquare(matrix221));