void setZeroes(vector<vector<int> > &matrix) {
int m = matrix.size();
if(m > 0)
{
int n = matrix[0].size();
bool zeroFstRow = false, zeroFstCol = false;
for(int row = 0; row < m; row++)
{
if(matrix[row][0] == 0)
{
zeroFstCol = true;
}
}
for(int col = 0; col < n; col++)
{
if(matrix[0][col] == 0)
{
zeroFstRow = true;
}
}
for(int row = 1; row < m; row++)
{
for(int col = 1; col < n; col++)
{
if(matrix[row][col] == 0)
{
matrix[row][0] = 0;
matrix[0][col] = 0;
}
}
}
for(int row = 1; row < m; row++)
{
if(matrix[row][0] == 0)
{
for(int col = 1; col < n; col++)
{
matrix[row][col] = 0;
}
}
}
for(int col = 1; col < n; col++)
{
if(matrix[0][col] == 0)
{
for(int row = 1; row < m; row++)
{
matrix[row][col] = 0;
}
}
}
if(matrix[0][0] == 0)
{
for(int row = 1; row < m; row++)
{
matrix[row][0] = 0;
}
for(int col = 1; col < n; col++)
{
matrix[0][col] = 0;
}
}
else
{
if(zeroFstCol)
{
for(int row = 0; row < m; row++)
{
matrix[row][0] = 0;
}
}
if(zeroFstRow)
{
for(int col = 0; col < n; col++)
{
matrix[0][col] = 0;
}
}
}
}
}
思路类似于O(m+n)的改进方法,只不过这m+n的数据直接存在矩阵的第一行和第一列了;
也就是用矩阵的第一行的元素标识矩阵某一列是否置0,矩阵的第一列的元素标识矩阵某一行是否置1。
需要注意的是矩阵第一行和第一列元素本身就是0的情况。