原文:
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.
package chapter_1_arraysandstring;
import java.util.Scanner;
/**
* 写一个函数处理一个MxN的矩阵,如果矩阵中某个元素为0,那么把它所在的行和列都置为0.
*
* @author LiangGe
*
*/
public class Question_1_7 {
/**
* 通过建立两个boolean数组分别记录行和列是否出现0
* 之后再遍历二维数组,如果当前所在行或者列出现0,就修改为0
*
* 时间复杂度 0(n2)
*/
public static void changeMatrix(int array[][], int m, int n) {
boolean rowTag[] = new boolean[m];
boolean columnTag[] = new boolean[n];
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(array[i][j] == 0) {
rowTag[i] = true;
columnTag[j] = true;
}
}
}
// 题目没有指明是否是稀疏矩阵,就不确定0出现的次数多不多
// 如果是稀疏矩阵可以只遍历行或者列,再如果行存在为0就再遍历修改对应行
// 如果0出现次数多,会导致重复修改
/* for(int i=0; i<m; i++) {
if(rowTag[i]) {
for(int j=0; j<n; j++) {
array[i][j] = 0;
}
}
}
for(int j=0; j<n; j++) {
if(columnTag[j]) {
for(int i=0; i<n; i++) {
array[i][j] = 0;
}
}
}*/
// 如果0出现的次数比较多,则可以直接遍历二维数组
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
if(rowTag[i] || columnTag[j]) {
array[i][j] = 0;
}
}
}
}
public static void printMatrix(int array[][], int m, int n) {
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
System.out.format("%3d", array[i][j]);
}
System.out.println();
}
}
public static void main(String args[]) {
Scanner scanner = new Scanner(System.in);
int m, n;
// 输入 0 0结束
while (scanner.hasNext()) {
m = scanner.nextInt();
n = scanner.nextInt();
if(m==0 && n==0) {
break;
}
scanner.nextLine();
int array[][] = new int[m][n];
for(int i=0; i<m; i++) {
for(int j=0; j<n; j++) {
array[i][j] = scanner.nextInt();
}
scanner.nextLine();
}
changeMatrix(array, m, n);
printMatrix(array, m, n);
}
}
}