leetcode 73 Set Matrix Zeroes

来源:互联网 发布:都怪本泽马什么梗 知乎 编辑:程序博客网 时间:2024/05/29 10:45

这是很简单的思路,不难想。

void setZeroes(vector<vector<int>>& matrix) {     vector<int> row;     vector<int> col;     int m = matrix.size();     int n = matrix[0].size();     for(int i=0;i<m;i++)     {         for(int j =0;j<n;j++)         {             if(matrix[i][j]==0)             {                 row.push_back(i);                 col.push_back(j);             }         }     }     for(int i = 0;i< row.size();i++){         for(int j=0;j<n;j++){             matrix[row[i]][j]=0;         }     }     for(int j=0;j<col.size();j++){         for(int i=0;i<m;i++){             matrix[i][col[j]]=0;         }     }}

};

但是空间复杂度是O(N)接下来是对它做个改善

      if(matrix.empty()||matrix[0].empty())return;      bool rowsign = false,colsign = false;      int m = matrix.size(),n = matrix[0].size();      //第一行第一列作为标记列则本身的信息被覆盖了,所以用rowsign和colsign去记录第一行列的情况      for(int i = 0;i<n;++i){          if(matrix[0][i]==0) rowsign = true;      }      for(int j= 0; j<m;++j){          if(matrix[j][0]==0) colsign = true;      }      for(int i=1;i<m;++i)//考虑不使用额外的空间,可以把空出来第一行与第一列作为标记行与标记列      {          for(int j=1;j<n;++j){              if(matrix[i][j]==0){                  matrix[0][j]=0;                  matrix[i][0]=0;              }          }      }      //标记已经做好,开始设置matrix的0,先利用第一行列标记去更新其他行列,再利用标记值去更新第一行列      for(int i=1;i<m;i++){          for(int j=1;j<n;j++){              if(matrix[0][j]==0||matrix[i][0]==0)              matrix[i][j]=0;          }      }      if(rowsign){          for(int j=0;j<n;++j){              matrix[0][j]=0;          }      }      if(colsign){          for(int i=0;i<m;++i){              matrix[i][0]=0;          }      }}

};

首先判断特殊情况,matrix为空
再设置两个标记值rowZero,colZero
1,O(mn),即用的一个相同大小的矩阵来记录那个位置有0.

2,O(m + n),就是加一行一列来标记哪行哪列有0。

3,常数空间,即考虑不使用额外的空间,可以把第一行与第一列作为标记行与标记列,但是得先确定第一行与第一列本身要不要设为0。

0 0