面试7之请编写一个算法,若N阶方阵中某个元素为0,则将其所在的行与列清零。

来源:互联网 发布:货到付款的淘宝有哪个 编辑:程序博客网 时间:2024/05/19 02:39
题目描述
请编写一个算法,若N阶方阵中某个元素为0,则将其所在的行与列清零。
给定一个N阶方阵int[][](C++中为vector>)mat和矩阵的阶数n,请返回完成操作后的int[][]方阵(C++中为vector>),保证n小于等于300,矩阵中的元素为int范围内。
测试样例:
[[1,2,3],[0,1,2],[0,0,1]]

返回:[[0,0,3],[0,0,0],[0,0,0]]

 

 (1)题目陷阱:
  一看到这个题目可能会想到遍历整个矩阵,只要发现值为0,就将其所在行和与列全部清零。这个是个错误的思想,当清零的时候,0元素覆盖了还没有遍历到的元素,所以只有数组有一个零,最后就导致整个数组全为0。

#include<iostream>using namespace std;#include<vector>vector<vector<int> > ClearZero(vector<vector<int> > mat,int n){vector<int>rows;vector<int >clows;for(size_t i = 0; i < mat.size(); ++i){for(size_t j = 0; j < mat[0].size(); ++j){if(mat[i][j] == 0)//将元素为0的行和列保存{rows.push_back(i);clows.push_back(j);}}}for(size_t i = 0; i < rows.size(); ++i)//处理行{int row = rows[i];for(size_t j = 0; j < mat[0].size(); ++j){mat[row][j] = 0;}}for(size_t j = 0; j < clows.size(); ++j) //处理列{int clow = clows[j];for(size_t i = 0; i < mat.size(); ++i){mat[i][clow] = 0;}}return mat;}int main(){vector<int> v[3];for(int i = 1; i <= 3; ++i)v[0].push_back(i);v[1].push_back(0);v[1].push_back(1);v[1].push_back(2);v[2].push_back(0);v[2].push_back(0);v[2].push_back(1);vector< vector<int> > v2;v2.push_back(v[0]);v2.push_back(v[1]);v2.push_back(v[2]);vector<vector<int> > mat = ClearZero(v2,v2.size());for (size_t i = 0; i < mat.size(); ++i){for(size_t j = 0; j < mat[0].size(); ++j){cout << mat[i][j] << " ";}cout << endl;}cout << "hello..." <<endl;}


0 0
原创粉丝点击