由于需要就地保存清零信息,所以把信息保存在第一行和第一列
1 class Solution { 2 public: 3 void setZeroes(vector<vector<int> > &matrix) { 4 const int ROW = matrix.size(); 5 if (ROW == 0) 6 return; 7 const int COL = matrix[0].size(); 8 if (COL == 0) 9 return; 10 11 // we store the 0 information in 12 // the 1st row and 1st col 13 bool R00 = false; 14 for(int i = 0; i < COL; ++i) 15 if (matrix[0][i] == 0) 16 { 17 R00 = true; 18 break; 19 } 20 bool C00 = false; 21 for(int i = 0; i < ROW; ++i) 22 if (matrix[i][0] == 0) 23 { 24 C00 = true; 25 break; 26 } 27 28 // now traverse the remaining parts of 29 // the matrix and store 0 into the 30 // first row 31 for(int i = 1; i < ROW; ++i) 32 for(int j = 1; j < COL; ++j) 33 if (matrix[i][j] == 0) 34 { 35 matrix[i][0] = 0; 36 matrix[0][j] = 0; 37 } 38 39 // use the first row/col information to 40 // fill zeros 41 for(int i = 1; i < ROW; ++i) 42 if (matrix[i][0] == 0) 43 for(int j = 1; j < COL; ++j) 44 matrix[i][j] = 0; 45 46 for(int i = 1; i < COL; ++i) 47 if (matrix[0][i] == 0) 48 for(int j = 1; j < ROW; ++j) 49 matrix[j][i] = 0; 50 51 // Finally check the 1st row/col 52 if (R00) 53 fill(begin(matrix[0]), end(matrix[0]), 0); 54 if (C00) 55 for(int i = 0; i < ROW; ++i) 56 matrix[i][0] = 0; 57 58 return; 59 } 60 };