完整实现代码如下:
java
class Solution {
public void setZeroes(int[][] matrix) {
//初始化结果存储数组
int M = matrix.length;
int N = matrix[0].length;
int[] rowRecord = new int[M];
int[] colRecord = new int[N];
//第一次循环遍历 标记需要置为0的行和列
for(int i = 0;i<M;i++){
for(int j = 0;j<N;j++){
if(matrix[i][j] == 0){
rowRecord[i] = 1; //用1 来标记是否行为0的存在
colRecord[j] = 1; //用1标记是否列为0的存在
}
}
}
//第二次循环 根据记录置为0
for(int i = 0;i<M;i++){
for(int j = 0;j<N;j++){
if(rowRecord[i] == 1 || colRecord[j] == 1){
matrix[i][j] = 0;
}
}
}
}
}
实现思路分析:在第一次遍历二维数组时,在矩阵中对于为0的位置进行标记,并且分别存入行和列的标记数组中,第二次遍历二维数组时,根据行和列的标记数组中的标记将矩阵的对应行和列都置为0
代码实现步骤:
1 初始化记录数组:
int M = matrix.length; // 获取矩阵的行数
int N = matrix[0].length; // 获取矩阵的列数
int[] rowRecord = new int[M]; // 创建行记录数组,初始值为0
int[] colRecord = new int[N]; // 创建列记录数组,初始值为0
2 第一次遍历,标记需要置为0的行和列:
for (int i = 0; i < M; i++) {
for (int j = 0; j < N; j++) {
if (matrix[i][j] == 0) {
rowRecord[i] = 1; // 标记第i行需要置零
colRecord[j] = 1; // 标记第j列需要置零
}
}
}
3 第二次遍历,需要根据标记数组的记录将对应的行和列置为0:
for (int row = 0; row < M; row++) {
for (int col = 0; col < N; col++) {
if (rowRecord[row] == 1 || colRecord[col] == 1) {
matrix[row][col] = 0; // 如果行或列被标记,则置零
}
}
}