leetcode [221]Maximal Square

Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's and return its area.

Example:

Input: 

1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0

Output: 4

题目大意:

求二维矩阵中正方形面积的最大值。

解法:

采用动态规划,二维数据dp[i][j]保存到点(i,j)的正方形的最大边长,对于最上面和最左边的行和列,有dp [i] [j] = matrix [i] [j] - '0',它们最多形成边长为1的正方形,当i>0,j>0时,如果matrix[i][j]='0',那么dp[i][j]=0,因为没有正方形能在此处包含‘0’。如果matrix [i] [j] ='1',我们将得到dp [i] [j] = min(dp [i-1] [j-1],dp [i-1] [j],dp [ i] [j-1])+ 1,这意味着该正方形将受其左,上和左上邻居的限制。

java:

class Solution {
    public int maximalSquare(char[][] matrix) {
        if(matrix.length==0||matrix[0].length==0) return 0;
        int [][]dp=new int[matrix.length][matrix[0].length];
        int sz=0;
        for(int i=0;i<matrix.length;i++){
            for(int j=0;j<matrix[0].length;j++){
                if(i==0||j==0||matrix[i][j]=='0') {
                    dp[i][j]=matrix[i][j]-'0';
                }else{
                    dp[i][j]=Math.min(dp[i-1][j],Math.min(dp[i][j-1],dp[i-1][j-1]))+1;
                }
                sz=Math.max(sz,dp[i][j]);
            }
        }
        
        return sz*sz;
    }
}

  这里的空间使用了o(mn)的大小,我们可以发现每次更新只使用了dp[i-1][j],dp[i-1][j-1](前一行),dp[i][j-1](当前行)这三个变量。可以优化成只存储前一行和当前行。

class Solution {
    public int maximalSquare(char[][] matrix) {
        if(matrix.length==0||matrix[0].length==0) return 0;
        int m=matrix.length,n=matrix[0].length;
        int []pre=new int[n];
        int []cur=new int[n];
        int sz=0;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(i==0||j==0||matrix[i][j]=='0') {
                    cur[j]=matrix[i][j]-'0';
                }else{
                    cur[j]=Math.min(pre[j-1],Math.min(pre[j],cur[j-1]))+1;
                }
                sz=Math.max(sz,cur[j]);
            }
            for(int p=0;p<n;p++) pre[p]=cur[p];
            for(int q=0;q<n;q++) cur[q]=0;
        }

        return sz*sz;
    }
}
posted @ 2019-04-29 14:41  小白兔云  阅读(118)  评论(0)    收藏  举报