111 lines
3.6 KiB
JavaScript
111 lines
3.6 KiB
JavaScript
/**
|
||
* 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;
|
||
}
|
||
}
|
||
}
|