最直接做法:拷贝一份数组,使用O(M*N)的辅助空间
记录下要置零的行和列,使用O(M+N)的辅助空间。
原地做法:用两个变量记录第一行和第一列的情况,用第一行和第一列来充当记录角色
class Solution { public: void setZeroes(vector<vector<int>>& matrix) { int n = matrix.size(), m = matrix[0].size(); int row0 = 0, col0 = 0; for(int i=0;i<n;i++) if(matrix[i][0]==0) col0 = 1; for(int i=0;i<m;i++) if(matrix[0][i]==0) row0 = 1; // 看每一行 for(int i=1;i<n;i++){ for(int j=0;j<m;j++){ if(matrix[i][j]==0) matrix[i][0] = 0; } } // 看每一列 for(int j=1;j<m;j++){ for(int i=0;i<n;i++){ if(matrix[i][j]==0) matrix[0][j] = 0; } } // 清理每一行 for(int i=1;i<n;i++){ if(matrix[i][0]==0){ for(int j=0;j<m;j++) matrix[i][j] = 0; } } // 清理每一列 for(int j=1;j<m;j++){ if(matrix[0][j]==0){ for(int i=0;i<n;i++) matrix[i][j] = 0; } } if(row0) { for(int i=0;i<m;i++) matrix[0][i] = 0; } if(col0){ for(int i=0;i<n;i++) matrix[i][0] = 0; } } };