Set Matrix Zeroes
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
思路:
如果允许额外存储行和列清零的信息,那么题目就没有意思了。希望只用O(1)的存储空间的时候,我们就得利用矩阵本身的存储空间了:把清零的信息保存在第一行和第一列里。
题解:
class Solution {
public:
void setZeroes(vector<vector<int> > &matrix) {
const int ROW = matrix.size();
if (ROW == 0)
return;
const int COL = matrix[0].size();
if (COL == 0)
return;
// we store the 0 information in
// the 1st row and 1st col
bool R00 = false;
for(int i = 0; i < COL; ++i)
if (matrix[0][i] == 0)
{
R00 = true;
break;
}
bool C00 = false;
for(int i = 0; i < ROW; ++i)
if (matrix[i][0] == 0)
{
C00 = true;
break;
}
// now traverse the remaining parts of
// the matrix and store 0 into the
// first row
for(int i = 1; i < ROW; ++i)
for(int j = 1; j < COL; ++j)
if (matrix[i][j] == 0)
{
matrix[i][0] = 0;
matrix[0][j] = 0;
}
// use the first row/col information to
// fill zeros
for(int i = 1; i < ROW; ++i)
if (matrix[i][0] == 0)
for(int j = 1; j < COL; ++j)
matrix[i][j] = 0;
for(int i = 1; i < COL; ++i)
if (matrix[0][i] == 0)
for(int j = 1; j < ROW; ++j)
matrix[j][i] = 0;
// Finally check the 1st row/col
if (R00)
fill(begin(matrix[0]), end(matrix[0]), 0);
if (C00)
for(int i = 0; i < ROW; ++i)
matrix[i][0] = 0;
return;
}
};