Input:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
Output:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
Input:
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
Output:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]
这个题目不是很难,但是LeetCode限制了我们,希望我们使用O(1)的空间复杂度,然后DO IT IN-PLACE。于是我将第一行和第一列定义为标志位,从2行2列开始遍历,如果为0,将为0的那行和列的第一位设置为0标志位。之后再次遍历一遍第一行和第一列,将有标志位的那一行或者一列置为零
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
if(matrix.size()==0||matrix[0].size()==0)
return ;
bool row=false,col=false;
//判断第一列是否有0
for(int i=0;i<matrix.size();++i)
if(matrix[i][0]==0){
row=true;
break;
}
//判断第一行是否有0
for(int i=0;i<matrix[0].size();++i)
if(matrix[0][i]==0){
col=true;
break;
}
if(row||col)
matrix[0][0]=0;
//如果某位是0,将对应的第一行第一列都设置为0
for(int i=1;i<matrix.size();++i){
for(int j=1;j<matrix[0].size();++j){
if(matrix[i][j]==0){
matrix[0][j]=0;
matrix[i][0]=0;
}
}
}
//如果第一列末位是0,将这一行所有的设置为0
for(int i=1;i<matrix.size();++i){
if(matrix[i][0]==0){
for(int j=1;j<matrix[0].size();++j){
matrix[i][j]=0;
}
}
if(row)
matrix[i][0]=0;
}
//如果第一行末位是0,将这一列所有的设置为0
for(int j=1;j<matrix[0].size();++j){
if(matrix[0][j]==0){
for(int i=1;i<matrix.size();++i){
matrix[i][j]=0;
}
}
if(col)
matrix[0][j]=0;
}
}
};