/** * https://leetcode.cn/problems/set-matrix-zeroes/?envType=study-plan-v2&envId=top-interview-150 * @param {number[][]} matrix * @return {void} Do not return anything, modify matrix in-place instead. */ const setZeroes = function (matrix) { }; /* 遍历每一个元素,如果遍历到的元素是零就把它横竖的所有元素都设置成零,并标记这一行和这一列已经设置过了,如果在这一列遇到了某个元素 也是0,那么就检查行标记是否已经右这一行,如果有就不处理,如果没有设置这一行的所有元素为0,并标记这一行,行处理反之 */ function f1(matrix) { const m = matrix.length; const n = matrix[0].length; const rowFlag = new Array(m).fill(false); // 行标记 const colFlag = new Array(n).fill(false); // 列标记 // 第一次遍历,记录哪些行和列需要置零 for (let i = 0; i < m; i++) { for (let j = 0; j < n; j++) { if (matrix[i][j] === 0) { rowFlag[i] = true; colFlag[j] = true; } } } // 第二次遍历,根据标记设置矩阵元素为0 for (let i = 0; i < m; i++) { for (let j = 0; j < n; j++) { if (rowFlag[i] || colFlag[j]) { matrix[i][j] = 0; } } } } /* 利用第一行来标记哪些列应该处理为零,利用第一列来标记哪些行应该处理为零,遍历除第一行和第一列的所有元素,假设matrix[i][j]===0,那么就在 matrix[0][j] = 0, matrix[i][0] = 0, 最后遍历所有的元素,如果它所在的行和列,只要其中之一等于零,那么就设置它为零,由于利用第一列和第一 行来存储信息,所以在收集信息之前需要判断第一行和第一列是否原本就有零,如果就记录,最后在上面所有步骤都处理完成之后通过记录的信息设置第一行 和第一列是否需要设置为零 */ function f2(matrix) { let rowFlag = false; // 标记矩阵的第一行是否原本就有零 let colFlag = false; // 标记矩阵的第一列是否原本就有零 const m = matrix.length; const n = matrix[0].length; // 如果第一行中某个元素是零,就标记为true for (let i = 0; i < n; i++) { if (matrix[0][i] === 0) { rowFlag = true; break; // 找到就可以退出了,不需要继续循环 } } // 如果第一列中某个元素是零,就标记为true for (let i = 0; i < m; i++) { if (matrix[i][0] === 0) { colFlag = true; break; // 找到就可以退出了,不需要继续循环 } } // 遍历剩余的元素,如果是零,就在第一行和第一列标记为零 for (let i = 1; i < m; i++) { for (let j = 1; j < n; j++) { if (matrix[i][j] === 0) { matrix[0][j] = 0; matrix[i][0] = 0; } } } // 遍历第一行,如果发现当前的值为零,就设置其列为零 for (let i = 1; i < n; i++) { // 从1开始,跳过matrix[0][i] if (matrix[0][i] === 0) { for (let j = 0; j < m; j++) { // 设置i列的所有元素为零 matrix[j][i] = 0; } } } // 遍历第一列,如果发现当前的值为零,就设置其行为零 for (let i = 1; i < m; i++) { // 从1开始,跳过matrix[i][0] if (matrix[i][0] === 0) { for (let j = 0; j < n; j++) { // 设置i行的所有元素为零 matrix[i][j] = 0; } } } // 通过rowFlag和colFlag来判断第一列和第一行是否需要全部设置为零 if (rowFlag) { for (let i = 0; i < n; i++) { matrix[0][i] = 0; } } if (colFlag) { for (let i = 0; i < m; i++) { matrix[i][0] = 0; } } }