来自http://www.cnblogs.com/codingmylife/archive/2012/10/07/2714010.html,本人做了些注释,稍作修改,自己也实现了下,还挺有意思的
第一种方法用i,j存储记录有零的行,列,然后清空。第二种方法,比较巧妙,在O(1)空间上完成
#include <iostream> #include <vector> #include <utility> using namespace std; //题意是要求在01矩阵中,把0的点的行和列都置零。 void unguarded_setZero(int *matrix, int m, int n, int i, int j) { for (int ii = 0; ii < m; ++ii) { *(matrix + ii * n + j) = 0; } for (int jj = 0; jj < n; ++jj) { *(matrix + i * n + jj) = 0; } } void solve(int *matrix, int m, int n) { if (matrix == NULL || m <= 0 || n <= 0) { return; } vector<pair<int, int> > vecZero; //存储为0的(行,列)值 for (int i = 0; i < m; ++i) { for (int j = 0; j < n; ++j) { if (*(matrix + i * n + j) == 0) { vecZero.push_back(make_pair(i, j)); //make_pair } } } for (vector<pair<int, int> >::const_iterator it = vecZero.begin(); it != vecZero.end(); ++it) { const int i = it->first; const int j = it->second; unguarded_setZero(matrix, m, n, i, j); } } int main(int argc, char **argv) { int matrix[][6] = { {1, 1, 0, 1, 1, 1}, {0, 1, 1, 1, 0, 1}, {1, 1, 1, 1, 1, 1} }; solve((int *)matrix, 3, 6); //sizeof()操作符返回是字节数 int row = sizeof(matrix)/sizeof(*matrix); //总共字节数除以一行的总字节数即行数 int col = sizeof(*matrix)/sizeof(**matrix); //一行字节数除以每个元素所占的字节 即是列数 for (size_t i = 0; i < sizeof(matrix) / sizeof(*matrix); ++i) { for (size_t j = 0; j < sizeof(*matrix) / sizeof(**matrix); ++j) { cout << matrix[i][j] << " "; } cout << endl; } system("pause"); }
#include <iostream> #include <vector> #include <utility> using namespace std; //题意是要求在01矩阵中,把0的点的行和列都置零。这里要求空间复杂度为O(1) void solve(int *matrix, int m, int n) { if (matrix == NULL || m <= 0 || n <= 0) { return; } int row,col; bool row_0_flag =false; bool col_0_flag = false; for(col =0; col < n;col++) //记录第0行的状态,以便最后赋值,但是有1的地方,对其他行列是有影响的 if(!matrix[0*n + col]) { row_0_flag = true; break; } for(row=0;row < m; row++) //第0列的状态,以便最后赋值,但是有1的地方,对其他行列是有影响的
if(!matrix[row*n + 0]) { col_0_flag = true; break; } for(row = 1;row <m;row++) for(col = 1; col <n;col++) { if(!matrix[row*n +col]) //因为 { matrix[0 * n + col] = 0; matrix[row * n +0] = 0; } } for(row =1;row <m;row++) for(col=1;col <n;col++) { if(!matrix[0*n+col] || !matrix[row*n +0]) matrix[row*n +col] = 0; } if(row_0_flag) { for(col=0;col<m;col++) matrix[0*m +col] =0; } if(col_0_flag) { for(row=0;row < n;row++) matrix[row*m +0] =0; } } int main(int argc, char **argv) { int matrix[][6] = { {1, 1, 0, 1, 1, 1}, {0, 1, 1, 1, 0, 1}, {1, 1, 1, 1, 1, 1} }; solve((int *)matrix, 3, 6); //sizeof()操作符返回是字节数 int row = sizeof(matrix)/sizeof(*matrix); //总共字节数除以一行的总字节数即行数 int col = sizeof(*matrix)/sizeof(**matrix); //一行字节数除以每个元素所占的字节 即是列数 for (size_t i = 0; i < sizeof(matrix) / sizeof(*matrix); ++i) { for (size_t j = 0; j < sizeof(*matrix) / sizeof(**matrix); ++j) { cout << matrix[i][j] << " "; } cout << endl; } system("pause"); }
#include <iostream> #include <vector> #include <utility> using namespace std; //题意是要求在01矩阵中,把0的点的行和列都置零。这里空间复杂度为O(1) void solve(int *matrix, int m, int n) { if (matrix == NULL || m <= 0 || n <= 0) { return; } int row,col; bool row_0_flag =false; bool col_0_flag = false; for(col =0; col < n;col++) //第0行 if(!matrix[0*n + col]) //注意行,列,n是总列数,用来跳行 { row_0_flag = true; break; } for(row=0;row < m; row++) //第0列 if(!matrix[row*n + 0]) { col_0_flag = true; break; } for(row = 1;row <m;row++) for(col = 1; col <n;col++) { if(!matrix[row*n +col]) //已经0行0列状态记录了,说明有0,可以设置 { matrix[0 * n + col] = 0; matrix[row * n +0] = 0; } } for(row =1;row <m;row++) for(col=1;col <n;col++) { if(!matrix[0*n+col] || !matrix[row*n +0]) //0行,0列中有零的,对应要清零 matrix[row*n +col] = 0; } if(row_0_flag) //要是开始就有0,则最后一起清空 { for(col=0;col< n;col++) //注意行,列 matrix[0 * n +col] =0; } if(col_0_flag) //要是开始就有0,则最后一起清空 { for(row=0;row <m;row++) matrix[row*n +0] =0; } }