(这个题目让我想到泡泡堂这个游戏,呵呵!)
解题思路:一开始想的是边遍历,边设置行和列为0并标记.这个方法的错误之处在于:这个过程会导致你无法找到所在行列的其它为0的元素。
所以,只能先遍历矩阵,找出所有的0元素所在的行和列,并记录下来。
之后,可以通过两种方式更新矩阵A,
1、通过遍历所有存在0元素的行、列,并置矩阵A中该行、列为0;时间复杂度为M×i+N×j(i,j为存在0的行和列个数)
2、再次遍历矩阵A,并判断A[i][j]的下标i或j是否在之前记录下来的存在0的行或列中,时间复杂度为M×N;
这是第一种更新矩阵解法
#include #include #include #include using namespace std;void set0(vector > arr){ set raw_set,col_set; for (int i=0;i
::iterator set_iter; vector
::iterator vec_iter; vector
>::iterator vec2_iter; for (set_iter=raw_set.begin();set_iter !=raw_set.end();set_iter++) for (vec_iter=arr[*set_iter].begin();vec_iter !=arr[*set_iter].end();vec_iter++) *vec_iter=0; for (vec2_iter=arr.begin();vec2_iter !=arr.end();vec2_iter++) for (set_iter=col_set.begin();set_iter!=col_set.end();set_iter++) (*vec2_iter)[*set_iter]=0; for (int i=0;i >n>>m; vector > arr(n); for (int i=0;i >x; arr[i].push_back(x); } set0(arr);}