# 矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法

进阶:

 

示例 1:

输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:
[[1,0,1],[0,0,0],[1,0,1]]

示例 2:

输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:
[[0,0,0,0],[0,4,5,0],[0,3,1,0]]

 

提示:

以下错误的选项是?

## aop ### before ```cpp #include using namespace std; ``` ### after ```cpp int main() { Solution sol; int a = 3, b = 3; vector> matrix = vector>(a, vector(b)) = {{1, 1, 1}, {1, 0, 1}, {1, 1, 1}}; sol.setZeroes(matrix); for (auto i : matrix) { for (auto j : i) cout << j << " "; cout << endl; } return 0; } ``` ## 答案 ```cpp class Solution { public: void setZeroes(vector> &matrix) { int row = matrix.size(); int col = matrix[0].size(); vector pos; for (int i = 0; i < row; i++) { for (int j = 0; j < col; j++) { if (matrix[i][j] == 0) { pos.push_back(i); pos.push_back(j); } } } for (int i = 1; i < pos.size(); i += 2) { int x = pos[i]; int y = pos[i + 1]; for (int j = 0; j < row; j++) { matrix[j][y] = 0; } for (int k = 0; k < col; k++) { matrix[x][k] = 0; } } } }; ``` ## 选项 ### A ```cpp class Solution { public: void setZeroes(vector> &matrix) { if (matrix.size() <= 0) return; int row = -1, col = -1; int i = 0; for (i = 0; i < matrix.size(); i++) { for (int j = 0; j < matrix[0].size(); j++) { if (matrix[i][j] == 0) { row = i; col = j; break; } } if (row != -1) break; } if (i == matrix.size()) return; for (int k = i + 1; k < matrix.size(); k++) { for (int j = 0; j < matrix[0].size(); j++) { if (matrix[k][j] == 0) { matrix[row][j] = 0; matrix[k][col] = 0; } } } for (i = 0; i < matrix[0].size(); i++) { if (i == col) continue; if (matrix[row][i] == 0) for (int j = 0; j < matrix.size(); j++) matrix[j][i] = 0; } for (i = 0; i < matrix.size(); i++) { if (i == row) continue; if (matrix[i][col] == 0) for (int j = 0; j < matrix[0].size(); j++) matrix[i][j] = 0; } for (i = 0; i < matrix.size(); i++) matrix[i][col] = 0; for (i = 0; i < matrix[0].size(); i++) matrix[row][i] = 0; } }; ``` ### B ```cpp class Solution { public: void setZeroes(vector> &matrix) { bool row = false, col = false; int m = matrix.size(), n = matrix[0].size(); for (int i = 0; i < m; ++i) { if (matrix[i][0] == 0) col = true; } for (int i = 0; i < n; ++i) { if (matrix[0][i] == 0) row = 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 (col) { for (int i = 0; i < m; ++i) matrix[i][0] = 0; } if (row) { for (int i = 0; i < n; ++i) matrix[0][i] = 0; } } }; ``` ### C ```cpp class Solution { public: void setZeroes(vector> &matrix) { int m = matrix.size(), n = matrix[0].size(); vector row(m, false), column(n, false); int i, j; for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { if (matrix[i][j] == 0) { row[i] = true; column[j] = true; } } } for (i = 0; i < m; i++) { if (row[i]) { for (j = 0; j < n; j++) matrix[i][j] = 0; } } for (i = 0; i < n; i++) { if (column[i]) { for (j = 0; j < m; j++) matrix[j][i] = 0; } } } }; ```