题目描述
描述:编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。
输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]
输入:
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
输出:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]
解题思路
思路1:最直观的想法是,使用一个uset存储0元素对应的行,使用一个uset存储0元素对应的列,然后遍历矩阵,将0元素对应的行和列分别存储在row和col中,接着分别遍历row和col将对应行的所有元素以及对应列的所有元素均赋值为0。
void setZeroes(vector<vector<int>>& matrix) {
unordered_set<int> row;
unordered_set<int> col;
int m=matrix.size();
int n=matrix[0].size();
// 存储为0对应的行和列
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(matrix[i][j]==0)
{
row.emplace(i);
col.emplace(j);
}
}
}
// 给行赋值0
for(auto r:row)
{
for(int k=0;k<n;k++)
{
matrix[r][k]=0;
}
}
// 给列赋值0
for(auto c:col)
{
for(int k=0;k<m;k++)
{
matrix[k][c]=0;
}
}
}
总结:使用uset可以对重复的行和列去重。