力扣题目
解题思路
java代码
力扣题目:
在一个由 '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
示例 2:
输入:matrix = [["0","1"],["1","0"]] 输出:1
示例 3:
输入:matrix = [["0"]] 输出:0
解题思路:
算法原理:
- 动态规划,通过计算以每个位置为右下角的最大正方形边长来逐步推导出整个矩阵中的最大正方形。
思路:
- 对于矩阵中的每个位置
(i, j)
,如果该位置是'1'
,则考虑它与左边、上边和左上角位置的关系。以该位置为右下角的最大正方形边长,是其左边、上边和左上角三个位置对应的正方形边长的最小值加 1。不断更新最大正方形的面积。 - 时间复杂度:,需要遍历整个矩阵。
空间复杂度:,使用了二维数组dp
来存储中间结果。
java代码:
package org.example.mouth7.today23;
public class Leetcode221 {
public static void main(String[] args) {
char[][] matrix = {
{'1','0','1','0','0'},
{'1','0','1','1','1'},
{'1','1','1','1','1'},
{'1','0','0','1','0'}};
System.out.println(maximalSquare(matrix));
}
public static int maximalSquare(char[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
int[][] dp = new int[m][n];
int max = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == '1') {
if (i == 0 || j == 0) {
dp[i][j] = 1;
} else {
dp[i][j] = Math.min(dp[i - 1][j], Math.min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;
}
max = Math.max(max, dp[i][j] * dp[i][j]);
}
}
}
return max;
}
}
更多详细内容同步到公众号,感谢大家的支持!
每天都会给刷算法的小伙伴推送明日一题,并且没有任何收费项