题目:
空间O(m+n)的解法:
用一个长(m+n)的bool数组,遍历矩阵并且,记录是哪一行哪一列为0即可,之后再根据这个进行取0.
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
//前m个用于记录行,后n个用于记录列
int m = matrix.size();
int n = matrix[0].size();
vector<bool>check(m+n,false);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(matrix[i][j]==0){
check[i] = true;
check[m+j] = true;}
}
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(check[i]||check[m+j])
matrix[i][j] = 0;
}
}
}
};
空间O(1)的算法:
所谓实现O(1)的原理同样和上一个原理一致,只不过上一个是通过额外的数组来记录,那么我们这个可以通过牺牲第一行和第一列来记录,那既然牺牲了第一行和第一列,我们就需要提前把第一行和第一列中的信息确定好。
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
//first_row,first_column用于记录第一行和第一列是否要置零
int m = matrix.size();
int n = matrix[0].size();
bool first_row = false;
bool first_column = false;
for(int j=0;j<n;j++){
if(matrix[0][j]==0){
first_row = true;
break;
}
}
for(int j=0;j<m;j++){
if(matrix[j][0]==0){
first_column = true;
break;
}
}
//除去第一行第一列开始遍历更新,因为即便是第一行第一列中出现了0,它在的位置就已经可以表示它所用要置零的行和列
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(matrix[i][j] == 0){
//行标记
matrix[i][0] = 0;
//列标记
matrix[0][j] = 0;
}
}
}
//更新置零
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
//如果该列出现0或者是该行出现0,则该数置0
if(matrix[0][j] == 0||matrix[i][0] == 0){
matrix[i][j] = 0;
}
}
}
//更新第一行和第一列
if(first_row){
for(int i=0;i<n;i++)
matrix[0][i] = 0;
}
if(first_column){
for(int i=0;i<m;i++)
matrix[i][0] = 0;
}
}
};