【题干】
给定一个?m x n
?的矩阵,如果一个元素为?0?,则将其所在行和列的所有元素都设为?0?。请使用?原地?算法。
进阶:
O(mn)
?的额外空间,但这并不是一个好的解决方案。O(m?+?n)
?的额外空间,但这仍然不是最好的解决方案。【思路】
【题解】
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
bool flag1 = false;//表示第一行是否有0
bool flag2 = false;//表示第一列是否有0
int rows = matrix.size();
int cols = matrix[0].size();
for(int i=0;i<rows;i++){
if(matrix[i][0]==0)
flag2 = true;
}
for(int i=0;i<cols;i++){
if(matrix[0][i]==0)
flag1 = true;
}
for(int i=1;i<rows;i++){//以第一行和第一列为标志位,标志是否这一行/列置0
for(int j=1;j<cols;j++){
if(matrix[i][j]==0){
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
//把标志位所在列置0
for(int i=1;i<cols;i++){
if(matrix[0][i]==0){
for(int j=1;j<rows;j++){
matrix[j][i] = 0;
}
}
}
//把标志位所在行置0
for(int i=1;i<rows;i++){
if(matrix[i][0]==0){
for(int j=1;j<cols;j++)
matrix[i][j] = 0;
}
}
//如果第一行有0存在则将第一行置0
if(flag1==true){
for(int i=0;i<cols;i++)
matrix[0][i] = 0;
}
//如果第一列有0存在则将第一列置0
if(flag2==true){
for(int i=0;i<rows;i++)
matrix[i][0] = 0;
}
return;
}
};