题目
原文:
Write an algorithm such that if an element in an MxN matrix is 0, its entire row and column is set to 0.
译文:
写一个算法使一个MxN的矩阵中出现0的元素的行和列都设为0.
解答
遍历一遍矩阵,将出现0的元素用两个数组将其行列号存储下来,或开一个行数组row和列数组col,当元素a[i][j]等于0时, 就把row[i]和col[j]置为true,第二次遍历的时候,将对应的行列号置为0即可,下面的两种写法:
class Q1_7{
public static void setZero(int[][] matrix){
//存储元素为0的位置的行列号
int[] row=new int[matrix.length];
int[] column=new int[matrix[0].length];
int k=0,l=0;
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[0].length;j++){
if(matrix[i][j]==0){
row[k++]=i;
column[l++]=j;
}
}
}
for(int i=0;i<row.length;i++){
for(int j=0;j<matrix[0].length;j++){
matrix[row[i]][j]=0;
}
}
for(int i=0;i<column.length;i++){
for(int j=0;j<matrix.length;j++){
matrix[j][column[i]]=0;
}
}
}
//另一种写法
public static void setZeros(int[][] matrix){
int[] row=new int[matrix.length];
int[] column=new int[matrix[0].length];
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[0].length;j++){
if(matrix[i][j]==0){
row[i]=1;
column[j]=1;
}
}
}
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[0].length;j++){
if(row[i]==1||column[j]==1){
matrix[i][j]=0;
}
}
}
}
public static void main(String[] args){
int[][] a={
{1,2,0,4},
{0,3,9,5},
{4,6,8,3}
};
//setZero(a);
setZeros(a);
for(int i=0;i<3;i++){
int j;
for(j=0;j<3;j++)
System.out.printf(a[i][j]+",");
System.out.println(a[i][j]);
}
}
}
如有更好方法,还望交流!
---EOF---