利用额外空间O(m+n)的做法是很简洁的:
void setZeroes(int **matrix, int m, int n) {
if(matrix == NULL || *matrix == NULL) return;
if(m <= 0 || n <= 0) return;
int *rowflag = malloc(sizeof(int) * m);
int *colflag = malloc(sizeof(int) * n);
memset(rowflag,0,m * sizeof(int));
memset(colflag,0,n * sizeof(int));
int i,j;
for(i = 0; i < m; i++){
for(j = 0; j < n; j++){
if(matrix[i][j] == 0){
rowflag[i] = 1;
colflag[j] = 1;
}
}
}
for(i = 0; i < m; i++){
for(j = 0; j < n; j++){
if(rowflag[i] == 1 || colflag[j] == 1){
matrix[i][j] = 0;
}
}
}
}
利用常数空间也可以:
就需要巧妙地利用原来矩阵的空间,这里利用第一行和第一列保存额外信息:
1 先判断号第一行和第一列是否需要全部置零
2 有任何一个该行或者该列的元素为零那么这个第一行或者第一列的元素必然是零,就保存这个零,最后用来判断整个矩阵的这一行或者这一列是否需要置零。
3 最后再根据前面判断,决定是否把这个第一行和第一列置零。
void setZeroes(int **matrix, int m, int n) {
if(matrix == NULL || *matrix == NULL) return;
if(m <= 0 || n <= 0) return;
int colflag = 1;
int i,j;
for(i = 0; i < m; i++){
if(matrix[i][0] == 0) colflag = 0;
for(j = 1; j < n; j++){
if(matrix[i][j] == 0){
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for(i = m-1; i >= 0; i--){ //注意由于用了第一行和第一列来存储信息,所有应该从最后一个元素逆序遍历
for(j = n-1; j > 0; j--){
if(matrix[i][0] == 0 || matrix[0][j] == 0){
matrix[i][j] = 0;
}
}
if(colflag == 0) matrix[i][0] = 0;
}
}