具体思想:
注意两点:
1.如果采用O(m+n),使用两个vector分别存储行列上的0值,便于把整行整列置0;
2.如果采用O(1),则需要记录第一行第一列是否含0,便于最后把第一行第一列也置为零,但是后续把第一行第一列作为记录数组;
具体代码:
O(1):
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
bool row_zero=false;
bool col_zero=false;
for(int i=0;i<matrix.size();i++){
if(!matrix[i][0])
col_zero=true;
}
for(int i=0;i<matrix[0].size();i++){
if(!matrix[0][i])
row_zero=true;
}
for(int i=1;i<matrix.size();i++){
for(int j=1;j<matrix[0].size();j++){
if(!matrix[i][j]){
matrix[i][0]=0;
matrix[0][j]=0;
}
}
}
for(int i=1;i<matrix.size();i++){
for(int j=1;j<matrix[0].size();j++){
if(!matrix[i][0]||!matrix[0][j])
matrix[i][j]=0;
}
}
if(row_zero){
for(int i=0;i<matrix[0].size();i++){
matrix[0][i]=0;
}
}
if(col_zero){
for(int i=0;i<matrix.size();i++){
matrix[i][0]=0;
}
}
}
};
O(m+n):
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
vector<int>rows(matrix.size());
vector<int>cols(matrix[0].size());
for(int i=0;i<matrix.size();i++){
for(int j=0;j<matrix[0].size();j++){
if(!matrix[i][j]){
rows[i]=1;
cols[j]=1;
}
}
}
for(int i=0;i<rows.size();i++){
for(int j=0;j<cols.size();j++){
if(rows[i]==1||cols[j]==1){
matrix[i][j]=0;
}
}
}
}
};