在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。利用动态规划算法求解,具体解析过程见代码注释。
package learnproject.lekou;
/*
* 221.最大正方形
* 题干:
* 在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积
*/
public class Demo221 {
/*
* 解题思路:要求面积最大,则只需要求出边最大即可
* 1.定义输入集合为char{}{} matrix,对二维数组进行遍历
* 2.当遍历到char{i}{j}元素时,要找到所形成正方形的边,
* 边长只和左边元素、上面元素、左上角元素相关,
* 定义二维数组int{}{} dp,保存每个节点形成的三角形的边长
* 2.1 当matrix{i}{j}为1时,形成的正方形边长为Math.min(dp{i}{j-1},dp{i-1}{j},dp{i-1}{j-1})+1
* 3.最后返回计算面积即可
*/
public int maximalSquare(char[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
if(m<2 || n<2) {
for(int i=0;i<m;i++) {
char[] tempCharArray = matrix[i];
for(int j=0;j<n;j++) {
char tempchar = tempCharArray[j];
if(tempchar == '1') {
return 1;
}
}
}
return 0;
}
int max = 0;
int[][] dp = new int[m][n];
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(Math.min(dp[i-1][j], dp[i][j-1]),dp[i-1][j-1])+1;
}
max = Math.max(dp[i][j], max);
}
}
}
return (int) Math.pow(max, 2);
}
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'}};
Demo221 demo = new Demo221();
System.out.println(demo.maximalSquare(matrix));
}
}