leetCode_Maximal Square

来源:互联网 发布:网络直播合同范本 编辑:程序博客网 时间:2024/06/06 02:35

题意:在一个由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[n][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;          }      }  


0 0
原创粉丝点击