Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
分析:最直接想到的就是遍历该矩阵,每遇到0就把它所在的行和列全部置0,但这是错的,因为这样会引入新的0到矩阵中。下一个比较容易相到的方法是:遍历矩阵,每遇到一个0元素就把它所在的行和列标记起来,最后再遍历matrix,若某元素的行或者列下标被标记,则置为0,这种方法实现方便,但是其空间复杂度为O(m+n)。如果先按行遍历,当遇到0时,就把该行的所有非0元素置为UINT_MAX;然后按列遍历,若遇到UNIT_MAX的元素就把其置为0,若遇到0元素就把整列置为0,这样就做到了O(1)的空间复杂度。
解题代码:
class Solution {
public:
void setZeroes(vector<vector<int> > &matrix)
{
int m=matrix.size();
int n=matrix[0].size();
for (int i = 0; i < n; i++)
{
SetRow(matrix,i);
}
for (int j = 0; j < m; j++)
{
SetColumn(matrix,j);
}
}
public:
void SetColumn(vector<vector<int>>&matrix,int i)
{
int n=matrix.size();
int m=matrix[0].size();
unsigned k=UINT_MAX/2-1;
for (int j = 0; j<m; j++)
{
if (matrix[i][j]==0)
{
for (int l = 0; l <m; l++)
{
matrix[i][l]=0;
}
break;
}
else if (matrix[i][j]==k)
{
matrix[i][j]=0;
}
}
}
public:
void SetRow(vector<vector<int>>&matrix,int j)
{
int n=matrix.size();
int m=matrix[0].size();
bool flag=false;
for (int i = 0; i < n; i++)
{
if (matrix[i][j]==0)
{
flag=true;
break;
}
}
unsigned k=UINT_MAX/2-1;
if (flag)
{
for (int i = 0; i < n; i++)
{
if (matrix[i][j]!=0)
{
matrix[i][j]=k;
}
}
}
return;
}
};