221. 最大正方形

package leetcode;

public class demo_221 {
    public int maximalSquare(char[][] matrix) {
        if(matrix.length<0||matrix==null) {
            return 0;
        }
        int hegiht=matrix.length;
        int width=matrix[0].length;
        //以dp[i][j]为右下角的最大正方形边长
        int[][]dp=new int[hegiht][width];
        int max=0;
        //第一行和第一列dp[i][j]最大只可能为1
        for(int i=0;i<width;i++) {
            if(matrix[0][i]=='1') {
                dp[0][i]=1;
                max=1;
            }
        }
        for(int i=0;i<hegiht;i++) {
            if(matrix[i][0]=='1') {
                dp[i][0]=1;
                max=1;
            }
        }
        for(int i=1;i<hegiht;i++) {
            for(int j=1;j<width;j++) {
                //如果得当前值为0,则不可能为正方形
                if(matrix[i][j]=='0') {continue;}
                //动态规划,左方、上方、左上方中满足正方形的最小边长加一
                dp[i][j]=Math.min(dp[i-1][j], Math.min(dp[i][j-1], dp[i-1][j-1]))+1;
                if(dp[i][j]*dp[i][j]>max) {
                    max=dp[i][j]*dp[i][j];
                }
            }
        }
        System.out.println(max);
        return max;
    }
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        demo_221 demo=new demo_221();
        char[][] matrix= {{'1','0','1','0','0'},{'1','0','1','1','1'},{'1','1','1','1','1'},{'1','0','0','1','0'}};
        demo.maximalSquare(matrix);
    }

}

 

posted on 2022-04-26 10:34  一仟零一夜丶  阅读(36)  评论(0)    收藏  举报