原题大意为:在一个N阶(N*M也同理)的矩阵中,所有元素为1或0,请找出全为1的最大矩阵(K*K);
void deleteArray(int** arrary,int n)
{
assert(arrary!=NULL&&n>0);
for(int i=0;i<n;i++)
{
delete[] arrary[i];
arrary[i]=0;
}
delete[] arrary;
}
int findAll1MatrixWidth(int ** M,int n)
{
assert(M!=NULL&&n>=0);
int i=0;
for( ;i<n;i++)
assert(M[0]!=NULL);
int** Acc=new int*[n];
for (i=0;i<n;i++)
Acc[i]=new int[n];
int j=0;
for (i=0;i<n;i++)
Acc[0][i]=M[0][i];
for (i=1;i<n;i++)
for (j=0;j<n;j++)
Acc[i][j]=M[i][j]+Acc[i-1][j];
int res=0;
for (i=0;i<n;i++)
{
for (j=i;j<n;j++)
{
int rows=j-i+1;
int cols=0;
int k=0;
for (;k<n;k++)
{
if (Acc[j][k]-Acc[i][k]+M[i][k]==rows)
++cols;
else
cols=0;
if (cols==rows)
break;
}
if (cols ==rows )
res=::max(res,rows);
}
}
deleteArray(Acc,n);
return res;
}
这是O(N^3)但空间是O(N^2)的算法。
=====================更新======================
今天做了largest Rectangle in a HIstogram之后,发现如果利用该算法的话可以将本体的复杂度降为o(n2)。
其中largestRectangleArea()函数来自那篇文章。
新的代码如下:
int maximalRectangle(vector<vector<char> >& mat)
{
if (mat.empty()) return 0;
int m=mat.size();
int n=mat[0].size();
vector<vector<int> > grid(m,vector<int>(n,0));
int i,j;
for(i=0;i<n;i++)
grid[0][i]=mat[0][i]-'0';
for(i=1;i<m;i++)
{
for(j=0;j<n;j++)
{
if (mat[i][j]=='0')
grid[i][j]=0;
else
{
grid[i][j]=grid[i-1][j]+mat[i][j]-'0';
}
}
}
int ans=0;
for(i=0;i<m;i++)
{
int curMax=largestRectangleArea(grid[i]);
ans=max(ans,curMax);
}
return ans;
}