leetcode 73:矩陣置零
阿新 • • 發佈:2018-12-09
一 O(mn)的額外空間,定義陣列存放為0的位置
void setZeroes(std::vector<std::vector<int>>& matrix) { std::vector<int> m1; std::vector<int> m2; 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){ m1.push_back(i); m2.push_back(j); } } } for(int k=0;k<m1.size();k++){ int i=m1[k]; int j=m2[k]; for(int k=0;k<n;k++){ matrix[i][k]=0; } for(int k=0;k<m;k++){ matrix[k][j]=0; } } }
二 O(m+n)額外空間
我們可以m+n為m行和n列之和,而我們只需要標記一行或一列是否應該為0即可,所以可以建立陣列 存放一行或一列是否置0
void setZeroes(std::vector<std::vector<int>>& matrix) { int m=matrix.size(); int n=matrix[0].size(); std::vector<int> m1(m+n); for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(matrix[i][j]==0){ m1[m+j]=1; m1[i]=1; } } } for(int i=0;i<m;i++){ if(m1[i]==1) { for (int k = 0; k < n; k++) { matrix[i][k] = 0; } } } for(int i=m;i<m+n;i++){ if(m1[i]==1) { for (int k = 0; k < m; k++) { matrix[k][i-m] = 0; } } } }
三 O(1)
使用第一行和第一列的表示當前行和當前列是否為0,
如果第一行的第i個元素為0 將第i列置0 在置0時先不改變第一列第一行的元素,最後該變第一行第一列的元素 第一行和第一列是否置0在最開始時就需要標記
void setZeroes(std::vector<std::vector<int>>& matrix) { int m=matrix.size(); int n=matrix[0].size(); bool row= false; bool col=false; for(int i=0;i<m;i++){ if(matrix[i][0]==0) { col = true; break; } } for(int i=0;i<n;i++){ if(matrix[0][i]==0) { row = true; break; } } for(int i=0;i<m;i++){ for(int j=0;j<n;j++){ if(matrix[i][j]==0){ matrix[i][0]=0; matrix[0][j]=0; } } } for(int i=1;i<m;i++){ if(matrix[i][0]==0) { for (int k =1; k < n; k++) { matrix[i][k] = 0; } } } for(int i=1;i<n;i++) { if (matrix[0][i] == 0) { for (int k = 1; k < m; k++) { matrix[k][i] = 0; } } } if(col){ for(int i=0;i<m;i++){ matrix[i][0]=0; } } if(row){ for(int i=0;i<n;i++){ matrix[0][i]=0; } } }