普通思路
开辟额外两个哈希数组空间存储含有元素0的横坐标和纵坐标。时间复杂度O(m*n),空间复杂度O(n)。c++代码如下:
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int n=matrix.size();
int m=matrix[0].size();
map<int,int> mp_row;
map<int,int> mp_col;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(matrix[i][j]==0)
{
mp_row[i]=1;
mp_col[j]=1;
}
}
}
for(auto e:mp_row)
{
int row=e.first;
for(int j=0;j<m;j++) matrix[row][j]=0;
}
for(auto e:mp_col)
{
int col=e.first;
for(int i=0;i<n;i++) matrix[i][col]=0;
}
return ;
}
};
思路进阶
当某处出现零时,其所在列、所在行的所有节点都将会清零,那么我们不如把0元素的横纵坐标分别用所在列、所在行的第一个元素变成0来记录,因为迟早都会被清零。
做法
首先记录第一行第一列是否有0,然后利用第一行第一列作为标记,先清除非第一行或非第一列的数据,最后根据第一列第一列是否有0来清除第一行第一列。c++代码如下:
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
int n=matrix.size();
int m=matrix[0].size();
bool IsFirstRowZero=false;//分别记录原matrix的第一行第一列是否有0
bool IsFirstColZero=false;
//先记录第一行和第一列是否有0
for(int j=0;j<m;j++){
if(matrix[0][j]==0){
IsFirstRowZero=true;
break;
}
}
for(int i=0;i<n;i++)
{
if(matrix[i][0]==0){
IsFirstColZero=true;
break;
}
}
//再统计其他行列是否有0
for(int i=1;i<n;i++){
for(int j=1;j<m;j++)
{
if(matrix[i][j]==0){
matrix[i][0]=0;
matrix[0][j]=0;
}
}
}
//最后遍历matrix的第一行和第一列,将对应的位置清0
for(int i=1;i<n;i++){
for(int j=1;j<m;j++){
if(matrix[i][0]==0||matrix[0][j]==0){
matrix[i][j]=0;
}
}
}
//别忘了查看IsFirstRowZero、IsFirstColZero
if(IsFirstRowZero) for(int j=0;j<m;j++) matrix[0][j]=0;
if(IsFirstColZero) for(int i=0;i<n;i++) matrix[i][0]=0;
return ;
}
};