1.7 将一个MxN矩阵所有为0的元素所在行和列全部置0
(这个题目让我想到泡泡堂这个游戏,呵呵!)
解题思路:一开始想的是边遍历,边设置行和列为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<iostream> #include<set> #include<vector> #include<string> using namespace std; void set0(vector<vector<int> > arr){ set<int> raw_set,col_set; for (int i=0;i<arr.size();i++){ for (int j=0;j<arr[i].size();j++) { //cout<<arr[i][j]<<" "; if (arr[i][j] == 0){ raw_set.insert(i); col_set.insert(j); } } } for (int i=0;i<arr.size();i++){ for (int j=0;j<arr[i].size();j++) { cout<<arr[i][j]<<" "; } cout<<endl; } set<int>::iterator set_iter; vector<int>::iterator vec_iter; vector<vector<int> >::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<arr.size();i++){ for (int j=0;j<arr[i].size();j++) { cout<<arr[i][j]<<" "; } cout<<endl; } } int main(){ int n=0,m=0,x; cin>>n>>m; vector<vector<int> > arr(n); for (int i=0;i<n;i++) for (int j=0;j<m;j++) { cin>>x; arr[i].push_back(x); } set0(arr); }