http://oj.leetcode.com/problems/set-matrix-zeroes/
// For constant memory requirement, we normaly have two ways:
// 1. Finding a way to use a few variables to represent the status
// 2. Using the existing memory to represent the status
// For this questions, I am using the existing first row and col to represent the status.
// Because if there is a 0 at a position,
// then the corresponding element at first row and col will be changed to 0 ultimately
class Solution {
public:
void setZeroes(vector<vector<int> > &matrix) {
int M=matrix.size();
if(M==0) return;
int N=matrix[0].size();
bool row0=false, col0=false;
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
if(matrix[i][j]==0){
if(i==0) row0=true;
if(j==0) col0=true;
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(row0)
for(int j=0;j<N;j++) matrix[0][j]=0;
if(col0)
for(int i=0;i<M;i++) matrix[i][0]=0;
}
};