题目:对于一个m*n的矩阵,如果某一个元素为0,则把该元素所在行及所在列均置为0。要求只允许使用O(1)的空间。
因为只允许使用O(1)的空间,因此需要使用矩阵内部的一部分元素来做标记。
void setZeroes(vector<vector<int> > &matrix) {
int m = matrix.size();
if (m == 0) return;
int n = matrix[0].size();
bool firstRowHas0(false);
bool firstColHas0(false);
int i,j;
// 使用第一行和第一列来做标记,先记录第一行和第一列是否有0值
for (i=0; i<m; i++) {
if (!matrix[i][0]) {
firstColHas0 = true;
break;
}
}
for (j=0; j<n; j++) {
if (!matrix[0][j]) {
firstRowHas0 = true;
break;
}
}
// 利用第一行和第一列来记录剩下的部分哪些行列有0值
for (i=1; i<m; i++) {
for (j=1; j<n; j++) {
if (!matrix[i][j]) {
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
}
// 根据第一列的标记,对应的0值所在行均置为0
for (i=1; i<m; i++) {
if (!matrix[i][0]) {
for (j=0; j<n; j++) {
matrix[i][j] = 0;
}
}
}
// 根据第一行的标记,对应的0值所在列均置为0
for (j=1; j<n; j++) {
if (!matrix[0][j]) {
for (i=0; i<m; i++) {
matrix[i][j] = 0;
}
}
}
// 最后更新第一行和第一列的0值
if (firstColHas0) {
for (i=0; i<m; i++) {
matrix[i][0] = 0;
}
}
if (firstRowHas0) {
for (j=0; j<n; j++) {
matrix[0][j] = 0;
}
}
}