您的位置:首页 > 其它

清除行列

2016-03-01 10:11 120 查看

题目描述

请编写一个算法,若MxN矩阵中某个元素为0,则将其所在的行与列清零。

给定一个MxN的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]]

解答

题目的一个坑

  直接看题,可能会想要直接遍历整个矩阵,只要发现值为零的元素,就将它所在的行与列清零。但是这种方法存在一个陷阱:在读取被清零的行或列时,独到的全是零,于是它所在的行和列都得清零。结果就是,整个矩阵被清零。

正确的打开方式

  避坑的一个方法是,新建一个矩阵,来标记零元素的位置。然后遍历新建矩阵,将零元素所在行列清零。这种方法的空间复杂度是O(MN)。

  其实并不需要O(MN)的空间。既然打算将整行和整列清零,就不需要准确记录零元素的位置,而只需要知道某行、某列有元素为0就可以了。

  

class Clearer {
public:
vector<vector<int> > clearZero(vector<vector<int> > mat, int n) {
// write code here
bool *row = new bool[mat.size()];
bool *col = new bool[mat[0].size()];

for(int i = 0;i<mat.size();++i)
row[i] = false;
for(int i = 0;i<mat[0].size();++i)
col[i] = false;

for(int i = 0;i<mat.size();++i)
{
for(int j = 0;j<mat[0].size();++j)
{
if(mat[i][j] == 0)
{
row[i] = true;
col[j] = true;
}
}

}

for(int i = 0;i<mat.size();++i)
{
for(int j = 0;j<mat[0].size();++j)
{
if(row[i] || col[j])
{
mat[i][j] = 0;
}
}

}

return mat;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: