Q:Write an algorithm such that if an element in an MxN matrix is 0,its entire row and column is set to 0.
A: 通过遍历,可以用(m+n) 哈希表来储存每一列和每一行是否为0, 再根据哈希表的记录,再次遍历置0;
为了节省空间,可以在上面的思路基础之上进行优化:
1、首先遍历矩阵的第一行和第一列,记录下第一行和第一列是否有0
2、遍历矩阵,如果m[i][j] = 0, 则置m[i][0] = m[0][j] = 0;
3、再次遍历,如果m[i][0] == 0 或者 m[0][j] == 0, 则m[i][j] 置0
4、根据第一步的记录,决定是否将第一行和第一列置0还是置1
void setZeroes(vector<vector<int> > &matrix) {
bool row_has_zero = false;
bool col_has_zero = false;
const int m = matrix.size();
const int n = matrix[0].size();
for (int i = 0; i < m && !row_has_zero; i++) {
if (matrix[i][0] == 0) {
row_has_zero = true;
}
}
for (int j = 0; j < n && !col_has_zero; j++) {
if (matrix[0][j] == 0) {
col_has_zero = true;
}
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (matrix[i][j] == 0) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (matrix[i][0] == 0 || matrix[0][j] == 0) {
matrix[i][j] = 0;
}
}
}
if (row_has_zero) {
for (int i = 0; i < m; i++) {
matrix[i][0] = 0;
}
}
if (col_has_zero) {
for (int j = 0; j < n; j++) {
matrix[0][j] = 0;
}
}
}