题目描述

题解一(使用标记数组)
思路
- 我们可以用两个标记数组分别记录每一行和每一列是否有零出现。
- 具体地,我们首先遍历该数组一次,如果某个元素为 0,那么就将该元素所在的行和列所对应标记数组的位置置为 true。最后我们再次遍历该数组,用标记数组更新原数组即可
代码
java
class Solution {
public void setZeroes(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
boolean[] row = new boolean[m];
boolean[] col = new boolean[n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (matrix[i][j] == 0) {
row[i] = col[j] = true;
}
}
}
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (row[i] || col[j]) {
matrix[i][j] = 0;
}
}
}
}
}
题解二(使用两个标记变量)
思路

代码
java
class Solution {
public void setZeroes(int[][] matrix) {
int m = matrix.length;
int n = matrix[0].length;
// 记录第一行和第一列原本是否有 0
boolean firstRowHasZero = false;
boolean firstColHasZero = false;
// 1. 检查第一列是否有 0
for (int i = 0; i < m; i++) {//注意这里是行数m
if (matrix[i][0] == 0) {
firstColHasZero = true;
break;
}
}
// 1. 检查第一行是否有 0
for (int j = 0; j < n; j++) {//注意这里是列数n
if (matrix[0][j] == 0) {
firstRowHasZero = true;
break;
}
}
// 2. 遍历剩余矩阵,用第一行和第一列作为标记
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (matrix[i][j] == 0) {
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
// 3. 根据第一行和第一列的标记,将对应的元素置零
for (int i = 1; i < m; i++) {
for (int j = 1; j < n; j++) {
if (matrix[i][0] == 0 || matrix[0][j] == 0) {
matrix[i][j] = 0;
}
}
}
// 4. 最后单独处理第一列
if (firstColHasZero) {
for (int i = 0; i < m; i++) {//注意这里是行数m
matrix[i][0] = 0;
}
}
// 4. 最后单独处理第一行
if (firstRowHasZero) {
for (int j = 0; j < n; j++) {//注意这里是列数n
matrix[0][j] = 0;
}
}
}
}