思路:参考http://www.cnblogs.com/grandyang/p/4341590.html。
1.首先由row和col记录第一行和第一列中是否有零。(这一步是很有必要的,因为下面的步骤要将某个位置的零值,映射到第一行和第一列,将对应的第一行和第一列的某个值赋值为零。为了区分这个零是原来本来就有的零,还是后来被赋值的零,所有必须事先记录第一行和第一列中是否有零)
2.遍历除了第一行和第一列剩下的数组。如果出现零,则将该位置映射到第一行和第一列对应位置,并将该位置的值设为0.
3.根据第一行和第一列中的数据,将出现0的行和列,赋值为0。
4.最后对第一行和第一列进行赋值,根据col和row是否为true,来判断原来数组的第一行第一列是否有零,并完成赋值。
class Solution {
public:
void setZeroes(vector<vector<int>>& matrix) {
bool row=false,col=false;
int m=matrix.size(),n=matrix[0].size();
for(int i=0;i<m;++i) {if(matrix[i][0]==0) col=true;}
for(int i=0;i<n;++i) {if(matrix[0][i]==0) row=true;}
for(int i=1;i<m;++i)
for(int j=1;j<n;++j)
{
if(matrix[i][j]==0)
matrix[i][0]=0,matrix[0][j]=0;
}
for(int i=1;i<m;++i)
for(int j=1;j<n;++j)
{
if(matrix[i][0]==0||matrix[0][j]==0)
matrix[i][j]=0;
}
if(col)
{
for(int i=0;i<m;++i) matrix[i][0]=0;
}
if(row)
{
for(int i=0;i<n;++i) matrix[0][i]=0;
}
}
};