(原地算法) O(nm) 我们只需统计出矩阵中每一行或者每一列是否有0,然后把含有0的行或者列都置成0即可。
用两个变量记录第一行和第一列是否有0。 遍历整个矩阵,用矩阵的第一行和第一列记录对应的行和列是否有0。 把含有0的行和列都置成0。 时间复杂度分析:矩阵中每个元素只遍历常数次数,所以时间复杂度是 (nm)。 空间复杂度分析:只用了两个额外的变量记录第一行和第一列是否含有0,所以额外的空间复杂度是o (1),满足原地算法的要求。
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int r0=1,c0=1,n=matrix.size(),m=matrix[0].size();
for(int i=0;i<m;i++){
if(!matrix[0][i]){
r0=0;
break;
}
}
for(int i=0;i<n;i++){
if(!matrix[i][0]){
c0=0;
break;
}
}
for(int i=1;i<n;i++){
for(int j=1;j<m;j++){
if(!matrix[i][j]){
matrix[i][0]=0;
break;
}
}
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
if(!matrix[j][i]){
matrix[0][i]=0;
break;
}
}
}
for(int i=1;i<n;i++){
if(!matrix[i][0]){
for(int j=1;j<m;j++)matrix[i][j]=0;
}
}
for(int j=1;j<m;j++){
if(!matrix[0][j]){
for(int i=1;i<n;i++)matrix[i][j]=0;
}
}
if(!r0)for(int i=0;i<m;i++)matrix[0][i]=0;
if(!c0)for(int i=0;i<n;i++)matrix[i][0]=0;
}
};