题目描述
给定一个由0和1组成的2维矩阵,返回该矩阵中最大的由1组成的正方形的面积
示例1
输入
[[1,0,1,0,0],[1,0,1,1,1],[1,1,1,1,1],[1,0,0,1,0]]
输出
4
解:
这道题显然有明显的子结构,每一个正方形都由前一个(对角线)正方形叠加二来,所以我们可以建立DP关系 a[i][j] = max( a[i-1][j-1]+1 , someOf(a[i-1][j-1])+1 , 0) ,这里特别注意,包含关系可能是全包含,也可能是半包含。
import java.util.*;
public class Solution {
/**
* 最大正方形
* @param matrix char字符型二维数组
* @return int整型
*/
public int solve (char[][] matrix) {
int[][] arr=new int[matrix.length][matrix[0].length];
int max=0;
//初始化0列
for(int i=0;i<arr.length;i++){
if(matrix[i][0]=='1'){
arr[i][0]=1;
max=1;
}else{
arr[i][0]=0;
}
}
//初始化0行
for(int i=0;i<arr[0].length;i++){
if(matrix[0][i]=='1'){
arr[0][i]=1;
max=1;
}else{
arr[0][i]=0;
}
}
//DP填表
for(int i=1;i<arr.length;i++){
for(int j=1;j<arr[i].length;j++){
if(matrix[i][j]=='1'){
//显然,要构成最大正方形,利用对角前一个的最大正方形,再判定新行列是否满足即可
if(arr[i-1][j]>=arr[i-1][j-1] && arr[i][j-1]>=arr[i-1][j-1]){
arr[i][j]=arr[i-1][j-1]+1;
}else{
//仅包含前面最大正方形一部分
arr[i][j]=1;
for(int k=1;k<arr[i-1][j-1];k++){
if(matrix[i-k][j]!='1' || matrix[i][j-k]!='1'){
break;
}
arr[i][j]++;
}
}
}else{
//自己不满足,=0
arr[i][j]=0;
}
//顺便求解最大值
if(arr[i][j]>max){
max=arr[i][j];
}
}
}
return max*max;
}
}