请编写一个算法,若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]]
import java.util.ArrayList;
import java.util.Arrays;import java.util.List;
public class 清除行列 {
//当矩阵为N*N时,下面是我想到的方法
public static int[][] clearZero(int[][] mat, int n) {
//用两个数组分别记录0所在的行号和列号
List<Integer> row = new ArrayList<Integer>();
List<Integer> nolumn = new ArrayList<Integer>();
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(mat[i][j]==0){
row.add(i);
nolumn.add(j);
}
}
}
for(int i=0;i<row.size();i++){
int index=row.get(i);
for(int j=0;j<n;j++){
mat[index][j]=0;
}
}
for(int i=0;i<nolumn.size();i++){
int index=nolumn.get(i);
for(int j=0;j<n;j++){
mat[j][index]=0;
}
}
return mat;
}
//接下来是书上的,为M*N的矩阵
public static int[][] clearZero2(int[][] mat, int n) {
//用两个布尔型数组记录0的位置
boolean[] row = new boolean[mat.length];
boolean[] nolumn = new boolean[mat[0].length];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(mat[i][j]==0){
row[i]=true;//row对应行位零的行号
nolumn[j]=true;//nolumn对应列为0列号
}
}
}
//若行列有一个为true,就将mat[i][j]置为0
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(row[i]||nolumn[j]){
mat[i][j]=0;
}
}
}
return mat;
}
}