时间限制:3秒
空间限制:32768K
热度指数:3623
算法知识视频讲解
题目描述
请编写一个算法,若N阶方阵中某个元素为0,则将其所在的行与列清零。
给定一个N阶方阵int[][](C++中为vector<vector>)mat和矩阵的阶数n,请返回完成操作后的int[][]方阵(C++中为vector<vector>),保证n小于等于300,矩阵中的元素为int范围内。
测试样例:
[[1,2,3],[0,1,2],[0,0,1]]
返回:[[0,0,3],[0,0,0],[0,0,0]]
解题思路:一看到这个题目可能会想到遍历整个矩阵,只要发现值为0,就将其所在行和与列全部清零。这个是个错误的思想,当清零的时候,0元素覆盖了还没有遍历到的元素,所以只有数组有一个零,最后就导致整个数组全为0。为了装逼,学到一个size_t,应该是等于unsigned int的
#include<iostream> #include<string.h> #include<vector> using namespace std; vector<vector<size_t> > clearZero(vector<vector<size_t> > mat, size_t n) { vector<size_t>rows; vector<size_t >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) //处理列 { size_t clow = clows[j]; for(size_t i = 0; i < mat.size(); ++i) { mat[i][clow] = 0; } } return mat; } void printVector(vector<vector<size_t> > mat,size_t n) { for(size_t i = 0; i < n; i++) { for(size_t j = 0;j < n; j++) { cout << mat[i][j] << " "; } cout << endl; } } int main() { vector<vector<size_t> > n; vector<size_t> v; size_t m; size_t temp; while (cin >> m) { v.clear(); for (size_t i = 0; i<m; i++) { v.clear(); for (size_t j = 0; j < m; j++) { cin >> temp; v.push_back(temp); } n.push_back(v); } printVector(clearZero(n, m),m); } return 0; }
不懂的可以加我的QQ群:261035036(IT程序员面试宝典
群) 欢迎你的到来哦,看了博文给点脚印呗,谢谢啦~~