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);
}

 

posted on 2013-01-07 22:00  小龙人2012  阅读(1312)  评论(0编辑  收藏  举报

导航