classSolution { public: voidsetZeroes(vector<vector<int> > &matrix) { unordered_set<int> iuset; unordered_set<int> juset; int i, j, m = matrix.size(), n = matrix[0].size(); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { if (matrix[i][j] == 0) { iuset.insert(i); juset.insert(j); } } } for (i = 0; i < m; i++) { if (iuset.count(i)) { // This entire row is zero std::fill(matrix[i].begin(), matrix[i].end(), 0); continue; } for (j = 0; j < n; j++) { if (juset.count(j)) { matrix[i][j] = 0; } } } } };
classSolution { public: voidsetZeroes(vector<vector<int>>& matrix){ int m = matrix.size(); int n = matrix[0].size(); vector<int> row(m), col(n);
for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (!matrix[i][j]) { row[i] = col[j] = true; } } } for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (row[i] || col[j]) { matrix[i][j] = 0; } } } } };
If you want to save more space, you canFind the first element in the array that is 0, use its row and column arrays as records of rows/columns that are 0. Finally, set it to zero.
classSolution { public: voidsetZeroes(vector<vector<int> > &matrix) { int i, j, m = matrix.size(), n = matrix[0].size(); int flagi, flagj; bool fflag = false;
for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { if (matrix[i][j] == 0) { flagi = i; flagj = j; fflag = true; break; } } if (fflag) break; } if (!fflag) // There is no zero return;
for (i = 0; i < m; i++) { if (matrix[i][flagj] != 0) { // if matrix[i][flagj] == 0 it means row i is 0 matrix[i][flagj] = -1; } }
for (j = 0; j < n; j++) { if (matrix[flagi][j] != 0) { // if matrix[flagi][j] == 0 it means column j is 0 matrix[flagi][j] = -1; } }
for (i = 0; i < m; i++) { if (i == flagi) continue; for (j = 0; j < n; j++) { if (j == flagj) continue; if (matrix[i][j] == 0) { matrix[flagi][j] = 0; // tag as column j is 0 matrix[i][flagj] = 0; // tag as row i is 0 } } } for (i = 0; i < m; i++) { if (matrix[i][flagj] == 0) { // row i is all zeros if (i == flagi) continue; for (j = 0; j < n; j++) { if (j == flagj) continue; matrix[i][j] = 0; } } }
for (j = 0; j < n; j++) { if (matrix[flagi][j] == 0) { // column j is all zeros if (j == flagj) continue; for (i = 0; i < m; i++) { if (i == flagi) continue; matrix[i][j] = 0; } } }