题目描述
请编写一个算法,若N阶方阵中某个元素为0,则将其所在的行与列清零。
给定一个N阶方阵int[][](C++中为vector>)mat和矩阵的阶数n,请返回完成操作后的int[][]方阵(C++中为vector>),保证n小于等于300,矩阵中的元素为int范围内。
测试样例:
[[1,2,3],[0,1,2],[0,0,1]]
请编写一个算法,若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;
}