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

来源:互联网 发布:约瑟夫环 递归算法 编辑:程序博客网 时间:2024/06/06 04:48

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)

0 0