Set Matrix Zeroes

来源:互联网 发布:知乎法国婆婆 编辑:程序博客网 时间:2024/06/06 14:27

题目大意:给一个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