Set Matrix Zeroes

题目大意:给一个m行n列的二维数组,如果某一个位置的值是0,就将该位置所在的整行和整列的值都设置为0.进一步的要求是:额外需要的空间能否控制在O(1) space。

思路分析:第一种直观的思路是使用O(m+n)额外的空间,通过遍历二维数组记录哪些行和哪些列的值将会被全部置为0。第一种思路的代码如下:

void setZeroes(int** matrix, int matrixRowSize, int matrixColSize) {
    int i, j, flag;
    int *row, *col;
    row = (int*)malloc(sizeof(int) * matrixRowSize);
    col = (int*)malloc(sizeof(int) * matrixColSize);
    for(i=0; i<matrixRowSize; i++) {
        row[i] = 0;
    }
    for(i=0; i<matrixColSize; i++) {
        col[i] = 0;
    }
    for(i=0; i<matrixRowSize; i++) {
        for(j=0; j<matrixColSize; j++) {
            if(matrix[i][j] == 0) {
                row[i] = 1;
                col[j] = 1;
            }
        }
    }
    for(i=0; i<matrixRowSize; i++) {
        if(row[i]==1) {
            for(j=0; j<matrixColSize; j++) {
                matrix[i][j] = 0;
            }
        }
    }
    for(i=0; i<matrixColSize; i++) {
        if(col[i]==1) {
            for(j=0; j<matrixRowSize; j++) {
                matrix[j][i] = 0;
            }
        }
    }
}

第二种思路,考虑到额外的空间控制在O(1)space,所以可以将原二维数组的第一行和第一列利用起来,存储那些某行或者某列需要全部置为0的位置。比如说除第一行和第一列之外的第i行和第j列的值为0,那么就将matrix[i][0]和matri[0][j]的值都置为0用来记住某行和某列需要全部置为0,但是原来的第一行和第一列的值我们需要先进行处理,如果原数组的第一行有0,那么最后这一样要全部变成0,如果原数组第一列有0,那么第一列最后也要全部变成0,所以先用两个flag来标记一下第一行和第一列的情况。代码如下:

void setZeroes(int** matrix, int matrixRowSize, int matrixColSize) {
    int i, j;
    int rflag=0, cflag=0;
    for(i=0; i<matrixColSize; i++) {
        if(matrix[0][i] == 0) {
            rflag = 1;
        }
    }
    for(i=0; i<matrixRowSize; i++) {
        if(matrix[i][0] == 0) {
            cflag = 1;
        }
    }
    for(i=1; i<matrixRowSize; i++) {
        for(j=1; j<matrixColSize; j++) {
            if(matrix[i][j] == 0) {
                matrix[i][0] = 0;
                matrix[0][j] = 0;
            }
        }
    }
    for(i=1; i<matrixRowSize; i++) {
        if(matrix[i][0] == 0) {
            for(j=1; j<matrixColSize; j++) {
                matrix[i][j] = 0;
            }
        }
    }
    for(i=1; i<matrixColSize; i++) {
        if(matrix[0][i] == 0) {
            for(j=1; j<matrixRowSize; j++) {
                matrix[j][i] = 0;
            }
        }
    }
    if(cflag) {
        for(i=0; i<matrixRowSize; i++) {
            matrix[i][0] = 0;
        }
    }
    if(rflag) {
        for(i=0; i<matrixColSize; i++) {
            matrix[0][i] = 0;
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值