Timeline
Timeline
2025-11-17
init
Matrix
Problem:
At first I wrote it like this, but using a hash table for storage is inefficient.
12345678910111213141516171819202122232425262728293031323334 | using std::vector;using std::unordered_set;class Solution { public: void setZeroes(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 row is all 0 std::fill(matrix[i].begin(), matrix[i].end(), 0); continue; } for (j = 0; j < n; j++) { if (juset.count(j)) { matrix[i][j] = 0; } } } }}; |
You can change to recording in array form:
1234567891011121314151617181920212223 | class Solution {public: void setZeroes(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 can**Find the first element in the array that is 0, and use its row and column arrays to record the rows/columns that are 0.**Finally, set it to zero.
leetcode hot 100 rewrite:
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 | using std::vector;class Solution { public: void setZeroes(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 0 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 0 if (j == flagj) continue; for (i = 0; i < m; i++) { if (i == flagi) continue; matrix[i][j] = 0; } } } for (i = 0; i < m; i++) matrix[i][flagj] = 0; for (j = 0; j < n; j++) matrix[flagi][j] = 0; }};int main(){ Solution S; vector<vector<int> > matrix = { { 1, 1, 1 }, { 1, 0, 1 }, { 1, 1, 1 } }; S.setZeroes(matrix); for (vector<int> &vec : matrix) { for (int val : vec) { printf("%d ", val); } printf("\n"); }} |
