原题出处:https://leetcode.cn/leetbook/read/top-interview-questions-medium/xvmy42/
解法一:
class Solution {
public void setZeroes(int[][] matrix) {
int rowSize = matrix.length; // 行
int colSize = matrix[0].length; // 列
boolean[] rowBool = new boolean[rowSize]; // 该行中是否有0
boolean[] colBool = new boolean[colSize]; // 该列中是否有0
for (int i = 0 ; i < rowSize; i++) {
for (int j = 0 ; j < colSize; j++) {
if (matrix[i][j] == 0) {
rowBool[i] = true;
colBool[j] = true;
}
}
}
for (int i = 0 ; i < rowSize ; i++) {
for (int j = 0 ; j < colSize ; j++) {
if (rowBool[i] || colBool[j]) {
matrix[i][j] = 0;
}
}
}
}
}
思路:这题我们很容易就想到使用遍历的方式来完成,但是会出现一个问题,就是我们没法确定当前的这个0是原本的0还是完成转换后的0,我们可以进行两次遍历,第一次遍历分别找出哪一行哪一列存在0,并记录下来,第二次将行存在0或者列存在0的地方全部设置为0。
解法二:
class Solution {
public void setZeroes(int[][] matrix) {
boolean firstCol = false; // 第一行是否有0
boolean firstRow = false; // 第一列是否有0
int colSize = matrix.length; // 行数
int rowSize = matrix[0].length; // 列数
for (int i = 0 ; i < colSize; i++) {
for (int j = 0 ; j < rowSize; j++) {
if (matrix[i][j] == 0) {
if (i == 0) {
firstCol = true;
}
if (j == 0) {
firstRow = true;
}
matrix[0][j] = matrix[i][0] = 0;
}
}
}
for (int i = 1; i < colSize; i++) {
for (int j = 1; j < rowSize; j++) {
if (matrix[i][0] == 0 || matrix[0][j] == 0)
matrix[i][j] = 0;
}
}
// 表示第一列中存在有0的情况
if (firstRow) {
for (int i = 0; i < colSize; i++)
matrix[i][0] = 0;
}
// 表示第一行中存在有0的情况
if (firstCol) {
for (int j = 0; j < rowSize; j++)
matrix[0][j] = 0;
}
}
}
思路:和解法一的思路是一样的,不同的是,我们不需要额外的记录两个数组来保存哪行或者哪一列存在0,我们可以通过用原来二维数组的第一行或者第一列记录当前行或者列是否存在0即可,然后再第二次遍历的时候判断第一行或者第一列是否有0,有0将当前行或者列全部设置为0即可。不过这样会有一个问题,就是如果第一行或者第一列本来就有0,所以我们需要知道第一行或者第一列是否有0,后面在将第一行或者第一列设置为0。写的是否需要注意遍历第一行或者第一列时,注意遍历的行里别搞反了。