时间轴
时间轴
2025-11-17
init
矩阵
题目:
最开始我是这样写的,但是用哈希表存储效率很低。
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)) { // 这一行都为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; } } } }}; |
可以改成数组形式记录:
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; } } } }}; |
如果要再节省空间的话,可以找到数组中第一个为 0 的元素,用它的行列数组当作记录为 0 的行/列。最后再把它置零。
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) // 没有一个0 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) { // i 行都是 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) { // 第j列都是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"); }} |
