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

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值