题意:写一个函数处理一个MxN的矩阵,如果矩阵中某个元素为0,那么把它所在的行和列都置为0.要求空间复杂度为O(1)
思路:O(m+n)的算法,遍历一次矩阵,当遇到元素等于0时,记录下这个元素对应的行和列。可以开一个行数组row和列数组col,当元素a[i][j]等于0时,就把row[i]和col[j]置为true。第二次遍历矩阵时,当某个元素对应的行row[i]
或列col[j]被设置为true,说明该元素在需要被置0的行或列上,因此将它置0。
这里利用矩阵的第一行和第一列来作为辅助空间使用。不用开辟新的存储空间。方法就是:
1、先确定第一行和第一列是否需要清零
即,看看第一行中是否有0,记下来。也同时记下来第一列中有没有0。
1、先确定第一行和第一列是否需要清零
即,看看第一行中是否有0,记下来。也同时记下来第一列中有没有0。
2、利用O(m+n)的算法处理除第一行和第一列之外的数据,利用矩阵的第一行和第一列来作为辅助空间。
3、根据1中确定的状态,处理第一行和第一列。
如果最开始得到的第一行中有0的话,就整行清零。同理对列进行处理。代码:
void setZeroes(vector<vector<int> > &matrix) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int m=matrix.size();
if (0==m)
return;
int n=matrix[0].size();
if (0==n)
return;
bool rowIs0=false;
bool lineIs0=false;
for (int i=0;i<n;i++)
if (matrix[0][i]==0)
rowIs0=true;
for (int i=0;i<m;i++)
if (matrix[i][0]==0)
lineIs0=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 (rowIs0)
for (int i=0;i<n;i++)
matrix[0][i]=0;
if (lineIs0)
for (int i=0;i<m;i++)
matrix[i][0]=0;
}