111 lines
3.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 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;
}
}
}