这道题要我们使用原地算法,即使用少量的辅助变量来转换数据,这里我直接说结论,
我们可以直接把矩阵的第一行和第一列看为标记数组,如果矩阵中除第一行第一列外有零出现,那么就将他对应的行和列转换为0,接着我们可以用两个辅助变量来处理第一行第一列,l表示行,r表示列,如果第一行,第一列中有0则将对应的l或者r变为0;
知识点:
这里教了我们列怎么涂色。以前每见过。
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
a[j][i]=0
第一行枚举列,第二行枚举行,,每次保证列不变变行。
步骤:
1.判断l是否为0;
2.判断r是否为0;
3.判断地图中0出现的位置,将相对应的行和列标记为0;
4.根据相应的行和列将1转换为0,这里i和j均需从1开始,0的位置由l和r特判
5.判断l,r是否为0,对第一行第一列进行转换
class Solution {
public:
void setZeroes(vector<vector<int>>& a) {
if(a.empty())return ;
int n=a.size(),m=a[0].size();
int l=1,r=1;
for(int i=0;i<n;i++){
if(!a[i][0])l=0;
}
for(int i=0;i<m;i++){
if(!a[0][i])r=0;
}
for(int i=1;i<n;i++){
for(int j=1;j<m;j++){
if(!a[i][j]){
a[i][0]=0;
a[0][j]=0;
}
}
}
for(int i=1;i<n;i++){
if(!a[i][0])
for(int j=1;j<m;j++){
a[i][j]=0;
}
}
for(int i=1;i<m;i++){
if(!a[0][i]){
for(int j=1;j<n;j++){
a[j][i]=0;
}
}
}
if(!l)
for(int i=0;i<n;i++){
a[i][0]=0;
}
if(!r){
for(int i=0;i<m;i++){
a[0][i]=0;
}
}
}
};