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;
}
}

浙公网安备 33010602011771号