首页 > 代码库 > Set Matrix Zeroes

Set Matrix Zeroes

Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

思路:使用两个向量分别记录每一行和每一列是否存在0。

 1 class Solution { 2 public: 3     void setZeroes( vector<vector<int>> &matrix ) { 4         int rows = matrix.size(), cols = matrix[0].size(); 5         vector<bool> rowFlag( rows, false ), colFlag( cols, false ); 6         for( int i = 0; i < rows; ++i ) { 7             for( int j = 0; j < cols; ++j ) { 8                 if( matrix[i][j] == 0 ) { 9                     rowFlag[i] = colFlag[j] = true;10                 }11             }12         }13         for( int i = 0; i < rows; ++i ) {14             for( int j = 0; j < cols; ++j ) {15                 if( rowFlag[i] || colFlag[j] ) {16                     matrix[i][j] = 0;17                 }18             }19         }20         return;21     }22 };

fellow up要求常空间复杂度。显然,我们应该考虑利用数组本身来记录某行某列是否存在0。若某一行(或某一列)存在0,则该行(或该列)的第一个元素也必将被置为0。因此,我们可以使用数组的第一行和第一列来分别记录矩阵剩余部分的每一行和每一列是否存在0。同时,我们还需要两个标记来记录第一行和第一列是否本身就存在0。

 1 class Solution { 2 public: 3     void setZeroes( vector<vector<int>> &matrix ) { 4         if( matrix.empty() || matrix[0].empty() ) { return; } 5         int rows = matrix.size(), cols = matrix[0].size(); 6         bool rowFlag = false, colFlag = false; 7         // 检查第一列 8         for( int i = 0; i < rows; ++i ) { 9             if( matrix[i][0] == 0 ) { colFlag = true; break; }10         }11         // 检查第一行12         for( int j = 0; j < cols; ++j ) {13             if( matrix[0][j] == 0 ) { rowFlag = true; break; }14         }15         // 检查矩阵的剩余部分16         for( int i = 1; i < rows; ++i ) {17             for( int j = 1; j < cols; ++j ) {18                 if( matrix[i][j] == 0 ) {  matrix[i][0] = matrix[0][j] = 0; }19             }20         }21         // 置位矩阵的剩余部分22         for( int i = 1; i < rows; ++i ) {23             for( int j = 1; j < cols; ++j ) {24                 if( matrix[i][0] == 0 || matrix[0][j] == 0 ) {  matrix[i][j] = 0; }25             }26         }27         // 置位第一行28         if( rowFlag ) {29             for( int j = 0; j < cols; ++j ) { matrix[0][j] = 0; }30         }31         // 置位第一列32         if( colFlag ) {33             for( int i = 0; i < rows; ++i ) { matrix[i][0] = 0; }34         }35         return;36     }37 };

 

Set Matrix Zeroes