您的位置:首页 > 其它

[LeetCode] Set Matrix Zeroes (!!!!时间空间复杂度)

2015-08-27 14:40 393 查看
Set Matrix Zeroes

Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

click to show follow up.

Follow up:

Did you use extra space?

A straight forward solution using O(mn) space is probably a bad idea.

A simple improvement uses O(m + n) space, but still not the best solution.

Could you devise a constant space solution?

关键的问题是,当遇到A[i][j]等于0时,不能直接将第i行和第j列的元素都置为0,因为可能会影响到后面的元素,所以关键是下记录下ij的信息。

很容易想出的方法是,利用里一个行向量,一个列向量来存贮置位信息。这样空间复杂度就是O(m+n)

void SetRow(int **A, int n, int ri){
for(int k = 0; k <n; ++k)
A[ri][k]=0;
}

void SetCol(int **A, int m, int ci){
for(int k = 0; k<m; ++k)
A[k][ci]=0;
}
void setZeroes(int** A, int m, int n) {
int i,j;
int *c = (int *)malloc(sizeof(int)*n);
int *r = (int *)malloc(sizeof(int)*m);
memset(r,1,m*sizeof(int));
memset(c,1,n*sizeof(int));
for(i = 0; i < m; ++i)
for(j = 0; j <n; ++j)
if(A[i][j]==0){
r[i]=0;
c[j]=0;
}
for(i = 0; i <m; ++i)
if(r[i]==0)
SetRow(A,n,i);
for(i = 0; i <n; ++i)
if(c[i]==0)
SetCol(A,m,i);

}


进一步进行优化,会返现上面发生干扰的问题只是干扰ij之后的元素,想不发生干扰,那么可以用第0行和第0列来代替上面的r[] c[]。第0行和第0列是否需要置零只需要两个临时变量即可。

牛逼啊~ ~

void SetRow(int **A, int n, int ri){
for(int k = 0; k <n; ++k)
A[ri][k]=0;
}

void SetCol(int **A, int m, int ci){
for(int k = 0; k<m; ++k)
A[k][ci]=0;
}
void setZeroes(int** A, int m, int n) {
int i,j;
int r0=1,c0=1;
for(j=0;j<n;++j)
if(A[0][j]==0){
r0=0;
break;
}
for(i=0;i<m;++i)
if(A[i][0]==0){
c0=0;
break;
}
for(i = 1; i < m; ++i)
for(j = 1; j <n; ++j)
if(A[i][j]==0){
A[i][0]=0;
A[0][j]=0;
}
for(i = 1; i <m; ++i)
if(A[i][0]==0)
SetRow(A,n,i);
for(i = 1; i <n; ++i)
if(A[0][i]==0)
SetCol(A,m,i);
if(r0==0)
SetRow(A,n,0);
if(c0==0)
SetCol(A,m,0);

}


空间复杂度为o(1)时间复杂度为O(2mn)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: