您的位置:首页 > 其它

leetCode_Maximal Square

2016-06-28 17:13 344 查看
题意:在一个由0和1组成的数组中,找出最大的全由1构成的正方形

方法一:用sum数组记录从(0,0)点到该点的和,枚举对角线,枚举起点和终点,通过sum数组计算是否和题意。

int maximalSquare(vector<vector<char> >& matrix)
{
int i,j,k,tempAns=0,res=0,ij,ik;
if(matrix.size()==0) return 0;
int sum[500][500];
sum[0][0]=matrix[0][0]-'0';
for(i=1; i<matrix.size(); i++) sum[i][0]=sum[i-1][0]+matrix[i][0]-'0';
for(i=1; i<matrix[0].size(); i++) sum[0][i]=sum[0][i-1]+matrix[0][i]-'0';
for(i=1; i<matrix.size(); i++)
{
for(j=1; j<matrix[i].size(); j++) sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+matrix[i][j]-'0';
}
int start,end;
start=-1*(matrix[0].size()-1);
end=matrix.size()-1;
for(i=start; i<=end; i++)
{
int t;
if(i<=0) t=0;
else t=i;
for(t; t<matrix.size(); t++)
{
ij=t;
j=t;
tempAns=0;
while(j>=0&&j<matrix.size()&&j-i>=0&&j-i<matrix[0].size())
{
int tempSum=sum[j][j-i];
if(ij-i-1>=0&&ij-i-1<matrix[0].size()) tempSum=tempSum-sum[j][t-i-1];
if(ij-1>=0&&ij-1<matrix.size()) tempSum=tempSum-sum[t-1][j-i];
if(ij-i-1>=0&&ij-i-1<matrix[0].size()&&ij-1>=0&&ij-1<matrix.size())
tempSum=tempSum+sum[t-1][t-i-1];
if(tempSum==(j-t+1)*(j-t+1))
{
tempAns++;
if(tempAns>res) res=tempAns;
}
else break;
j++;
}
}

}
return res*res;
}

方法二:动态规划法。用sum[i][j]表示以i,j为右下角对角线的正方形长度。首先初始化sum[0][i]和sum[i][0],然后有递推公式sum[i][j]=min(sum[i-1][j],sum[i][j-1],sum[i-1][j-1])+1
代码来自:http://blog.csdn.net/xudli/article/details/46371673

public class Solution {
public int maximalSquare(char[][] matrix) {
if(matrix==null || matrix.length==0 || matrix[0].length==0) return 0;

int n = matrix.length;
int m = matrix[0].length;

int[][] d = new int
[m];
int max = 0;

for(int i=0; i<n; i++) {
if(matrix[i][0]=='1') {
d[i][0] = 1;
max = 1;
}
}

for(int j=0; j<m; j++) {
if(matrix[0][j]=='1') {
d[0][j] = 1;
max = 1;
}
}
for(int i=1; i<n; i++) {
for(int j=1; j<m; j++) {
if(matrix[i][j]=='0') d[i][j]=0;
else {
d[i][j] = Math.min( Math.min( d[i-1][j], d[i][j-1]), d[i-1][j-1] ) + 1;
max = Math.max(max, d[i][j]);
}
}
}
return max*max;
}
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划