思路
动态规划,这题主要得弄明白状态转换方程,dp[i][j]表示以(i,j)为右下角的最大正方形
解题方法
1.首先将第一行和第一列初始化,当对应位置的matrix为’0’时,dp数组对应位置也为零,否则为1
2.对剩下其他位置进行遍历,若对应位置的matrix为’0’时,dp数组对应位置也为零,若不为’0’,则为dp[i][j]=Math.min(dp[i-1][j],Math.min(dp[i-1][j-1],dp[i][j-1]))+1
3.最后dp数组中最大值的平方即为答案
Code
class Solution {public int maximalSquare(char[][] matrix) {int ans=0;int row=matrix.length;int cols=matrix[0].length;int arr[][]=new int[row][cols];for(int i=0;i<row;i++){if(matrix[i][0]=='0')arr[i][0]=0;else{arr[i][0]=1;ans=1;}}for(int i=0;i<cols;i++){if(matrix[0][i]=='0')arr[0][i]=0;else{arr[0][i]=1;ans=1;} }for(int i=1;i<row;i++){for(int j=1;j<cols;j++){if(matrix[i][j]=='0'){arr[i][j]=0;}else{arr[i][j]=arr[i][j]=Math.min(arr[i-1][j],Math.min(arr[i-1][j-1],arr[i][j-1]))+1;}ans=Math.max(arr[i][j],ans);}}return ans*ans;}
}