请编写一个算法,若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]]
- vector<vector<int>> clear(vector<vector<int>> mat, int n)
- {
- vector<vector<int>> temp = mat;
-
- for(int i=0; i<n; i++)
- {
- for(int j=0; j<n; j++)
- {
- if(mat[i][j]==0)
- {
- for(int k=0; k<n; k++)
- {
- temp[k][j] = 0;
- temp[i][k] = 0;
- }
- }
- }
- }
- return temp;
- }
-
【Java版】
- public int[][] clear(int[][] mat, int n)
- {
- boolean[] rowArray = new boolean[n];
- boolean[] colArray = new boolean[n];
- for(int i=0; i<n; i++)
- {
- for(int j=0; j<n; j++)
- {
- if(mat[i][j]==0)
- {
- rowArray[i] = true;
- colArray[j] =true;
- }
- }
- }
- for(int i=0; i<n; i++)
- {
- for(int j=0; j<n; j++)
- {
- if(rowArray[i] || colArray[j])
- {
- mat[i][j] = 0;
- }
- }
- }
- return mat;
- }
【HashSet】
public class
Clearer {
public class int
[][] clearZero(int
[][] mat, int n
) {
HashSet x = new
HashSet();
HashSet y = new
HashSet();
for(int
i=
0
; i<n; i++)
for(int
j=
0
; j<n; j++)
{
if
(mat[i][j] ==
0
)
{
x.add(i);
y.add(j);
}
}
for(int
i=
0
; i<n; i++) {
for(int
j=
0
; j<n; j++) {
if
(x.contains(i) || y.contains(j))
mat[i][j] =
0
;
}
}
return mat;
}
}