题目大意:给一个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; } } }
Set Matrix Zeroes
最新推荐文章于 2024-07-05 17:56:10 发布