Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
Did you use extra space?
A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?
We could use the first row as the storage. In each line, if we find some number is zero, we set this line as zero, and set the corresponding col in first row as 0.
In my original code, I did not use the first row as storage. I store the last row which I set as zero. In that row, I store all the col which will be set as zero later
class Solution {
public:
void setZeroes(vector<vector<int> > &matrix) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(matrix.size()== 0 || matrix[0].size() == 0)
return;
int rowNum = matrix.size(), colNum = matrix[0].size(), rowSet = -1;
int i, j;
for(i=0; i<rowNum; i++){
for(j=0; j<colNum; j++)
if(matrix[i][j] == 0)
break;
if(j < colNum){
if(rowSet == -1) {
rowSet = i;
for(j=0; j<colNum; j++)
if(matrix[i][j])
matrix[i][j] = 0;
else
matrix[i][j] = 1;
} else {
for(j=0; j<colNum; j++)
if(matrix[rowSet][j] || !matrix[i][j])
matrix[i][j] = 1;
else
matrix[i][j] = 0;
rowSet = i;
}
}
}
if(rowSet != -1)
for(j=0; j<colNum; j++)
if(matrix[rowSet][j])
for(i=0; i<rowNum; i++)
matrix[i][j] = 0;
}
};