零矩阵
先看题目
这道题还是一道比较简单的题,我看到这道题的第一反应是遇到0,就把0的行和列进行更新,但是一想发现不对,如果这样做的话,输出出来的矩阵就是个全0矩阵了。我想肯定有朋友是跟我一样的想法。于是我就换一个一个思路,把矩阵中0的位置记录下来,然后再进行循环,把0的行和列中的数组赋值为0。
贴代码
/**
* 这道题的坑是发现0后不能立即把n行n列全部置为0,否则整个矩阵就都是0了。避免了这个问题,这道题就迎刃而解了
* @param matrix
*/
public static int[][] setZeroes(int[][] matrix) {
// 使用list记录列位置
List<int[][]> list = new ArrayList<>();
// 行位置
int length = matrix.length;
for (int i = 0; i < length; i++) {
int ilength = matrix[i].length;
for (int j = 0; j < ilength; j++) {
if(0 == matrix[i][j]){
// 获取行和列
int[][] index = {{i,j}};
// 记录0的位置
list.add(index);
}
}
}
// 找到行位置后,将该位置对应的行和列更新成0,这步遍历二维数组,得到一维数组
list.stream().forEach(t -> {
// 遍历一维数组,得到具体的值
for (int i = 0; i < t.length; i++) {
// 循环次数取决于入参一维数组的长度
for (int k = 0; k < matrix[i].length; k++) {
// 更新行
// t[i]获取一维数组,[0]获取行数,不需要获取列,因为这里只对行操作,列无关紧要
// k自增就相当于是遍历这一行每一个数了
matrix[t[i][0]][k] = 0;
}
// 循环次数取决于入参数组中包含多少个一维数组
for (int l = 0; l < length; l++) {
// 更新列
// l自增可以获取每一列上的数
matrix[l][t[i][1]] = 0;
}
}
});
return matrix;
}
每次写完自己的算法,再看官方的题解,都能有一种豁然开朗的感觉,官方居然是用一个boolean数组进行记录,真的是又简洁又易懂,看来自己还是有很大的进步空间的。加油!