1.7问题:
编写一个算法,若M*N矩阵中某个元素为0,则将其所在的行与列清零。
思考:边遍历边置零,这样会有一个陷阱导致最后整个矩阵都会被置0。所以可以遍历两次,第一次确定0的位置,第二次置0相应行列。
import java.util.*;
class setzero{
public static void main(String args[]){
int a[][]={{1,1,1,1,1},{1,1,1,1,1},{1,1,0,1,1},{1,1,1,1,1},{1,1,1,1,1}};
System.out.println("Before\n");
printf(a);
setzero(a);
System.out.println("After\n");
printf(a);
}
public static void setzero(int[][] matrix){
boolean[] row = new boolean[matrix.length];//行数
boolean[] cloumn = new boolean[matrix[0].length];//列数
//第一次遍历找出有0行列。
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[0].length;j++){
if(matrix[i][j]==0){
row[i]=true;
cloumn[j]=true;
}
}
}
//第二次遍历置0行列。
for(int i=0;i<matrix.length;i++){
for(int j=0;j<matrix[0].length;j++){
if(row[i]||cloumn[j]){
matrix[i][j]=0;
}
}
}
}
public static void printf(int[][] a){
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
System.out.print(" "+a[i][j]);
}
System.out.print("\n\n");
}
}
}
思考:为了提高空间利用率,我们可以选用位向量替代布尔数组。