53 lines
2.2 KiB
Java
Raw Normal View History

2025-05-25 12:05:24 +08:00
package dynamic_programming;
/**
* 题目 221. 最大正方形 (maximalSquare)
* 描述在一个由 '0' '1' 组成的二维矩阵内找到只包含 '1' 的最大正方形并返回其面积
*
示例 1
输入matrix = [["1","0","1","0","0"],["1","0","1","1","1"],["1","1","1","1","1"],["1","0","0","1","0"]]
输出4
* 链接https://leetcode.cn/problems/maximal-square/
*/
//不会
public class MaximalSquare {
/**
* 那么如何计算 dp 中的每个元素值呢对于每个位置 (i,j)检查在矩阵中该位置的值
*
* 如果该位置的值是 0 dp(i,j)=0因为当前位置不可能在由 1 组成的正方形中
*
* 如果该位置的值是 1 dp(i,j) 的值由其上方左方和左上方的三个相邻位置的 dp 值决定具体而言当前位置的元素值等于三个相邻位置的元素中的最小值加 1状态转移方程如下
*
* dp(i,j)=min(dp(i1,j),dp(i1,j1),dp(i,j1))+1
*
* 作者力扣官方题解
* 链接https://leetcode.cn/problems/maximal-square/solutions/234964/zui-da-zheng-fang-xing-by-leetcode-solution/
* 来源力扣LeetCode
* 著作权归作者所有商业转载请联系作者获得授权非商业转载请注明出处
* @param matrix
* @return
*/
public int maximalSquare(char[][] matrix) {
int maxSide = 0;
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return maxSide;
}
int rows = matrix.length, columns = matrix[0].length;
int[][] dp = new int[rows][columns];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
if (matrix[i][j] == '1') {
if (i == 0 || j == 0) {
dp[i][j] = 1;
} else {
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]);
}
}
}
int maxSquare = maxSide * maxSide;
return maxSquare;
}
}