For 循环的运行似乎比预期的要多一倍



我在使用leetcode算法问题1252时遇到了问题。我不知道为什么,但我的 for 循环似乎运行了两次。问题是:

"给定 n 和 m,它们是由零初始化的矩阵的维度,并给定一个数组索引,其中索引 [i] = [ri, ci]。对于每对 [ri, ci],您必须将行 ri 和列 ci 中的所有单元格递增 1。

将增量应用于所有索引后,返回矩阵中具有奇数值的单元格数。

var oddCells = function(n, m, indices) {
let matrix = [];
let array = Array(m).fill(0);
let k = 0;
while (k < n) {
matrix.push(array);
k++;
}
for (let i = 0; i < indices.length; i++) {
const row = indices[i][0];
const col = indices[i][1];
for (let j = 0; j < n; j++) {
matrix[j][col]++;
}
for (let i = 0; i < m; i++) {
matrix[row][i]++;
}
}
return matrix.flat().filter(number => number % 2 !== 0).length;
}
console.log(oddCells(2, 3, [
[0, 1],
[1, 1]
]));

我正在测试的特定输入是n = 2, m = 3, indices = [[0,1],[1,1]]

我尝试手动遵循我的代码,但我无法弄清楚为什么两个内部 for 循环两次而不是每次迭代嵌套数组。在第一个循环[之后,矩阵应该是[[1, 2, 1], [0, 1, 0]]的,但我最终得到了[[1, 3, 1], [1, 3, 1]].

这是重用可变引用值的基本问题。

您重复将同一数组推送到矩阵,因此当您修改该数组中的任何值时,您正在修改矩阵的多个区域。

所以使用单独的数组:

var oddCells = function(n, m, indices) {
let matrix = [];
let k = 0;
while (k < n) {
matrix.push(Array(m).fill(0));
k++;
}
for (let i = 0; i < indices.length; i++) {
const row = indices[i][0];
const col = indices[i][1];
for (let ri = 0; ri < n; ri++) {
matrix[ri][col]++;
}
for (let ci = 0; ci < m; ci++) {
matrix[row][ci]++;
}
}
return matrix.flat().filter(number => number % 2 !== 0).length;
}
console.log(oddCells(2, 3, [
[0, 1],
[1, 1]
]));

最新更新