多维数组与矩阵之0所在的行列清零
问题描述
如果矩阵中的某个元素为0,则将其所在行和列清零
例如:
输出:
算法思路
这是一道考察数组下标的算法,有个小坑是:如果采用遇到一个零处理一个的方式,即在原数组上遇到一个零就把其对应的行和列元素变为零,则会把整个数组都变为0。
因为这是一个循环的过程,本来原数组中不为0的元素被消为0,产生错误,在数组中有0的情况下,整个数组都会被消为0。
所以采用新的数组来记录原数组中0元素的下标,用两个一维数组(分别长度为M、N)来替代一个M X N的二维数组,节省空间。
代码实现
public class _02_0所在的行列清零 {
public static void main(String[] args) {
int[][] matrix = {
{1,2,0,4},
{5,6,7,8},
{9,0,11,12},
{13,14,15,16}
};
solve(matrix);
}
public static void solve(int [][] matrix) {
int M = matrix.length;
int N = matrix[0].length;
//用两个一个数组来记录二维数组中为0的行下标与列下标,比用一个M X N的二维数组要节省空间
int[] row = new int[M];
int[] col = new int[N];
for (int i= 0;i < M;i ++) {
for (int j = 0;j < N;j ++) {
if (matrix[i][j] == 0) {
//标记0的行、列下标
row[i] = 1;
col[j] = 1;
}
}
}
//遍历两个一维数组中为1的下标,并把matrix中相应的行和列清零
for (int i = 0;i < M;i ++) {
for (int j = 0;j < N;j ++) {
if (row[i] == 1 || col[j] == 1) {
matrix[i][j] = 0;
}
}
}
//输出二维数组
for (int i = 0;i < M;i ++) {
for (int j = 0;j < N;j ++) {
System.out.print(matrix[i][j]+" ");
}
System.out.println();
}
}
}