问题描述
所以我正在用javascript自学数据结构,并正在尝试[Leetcode 200][1]。我想知道为什么如果我在这样的函数中有网格数组,它会起作用:
function numIslands(grid) {
const H = grid.length;
const W = H && grid[0].length;
let count = 0;
for (let r = 0; r < H; r++) {
for (let c = 0; c < W; c++) {
if (grid[r][c] === '0') continue;
count++;
dfs(r,c);
}
}
return count;
function dfs(r,c) {
if (r < 0 || c < 0 || r === H || c === W) return;
if (grid[r][c] === '0') return;
grid[r][c] = '0';
dfs(r-1,c);
dfs(r+1,c);
dfs(r,c-1);
dfs(r,c+1);
}
}
但是,如果我创建一个辅助函数并像这样将网格数组传递给它,它不起作用并且我收到一个错误消息
Line 25 in solution.js if (grid[r][c] === '0') return; TypeError: Cannot read property '1' of undefined
function numIslands(grid) {
const H = grid.length;
const W = H && grid[0].length;
let count = 0;
for (let r = 0; r < H; r++) {
for (let c = 0; c < W; c++) {
if (grid[r][c] === '0') continue;
count++;
dfs(r,c,grid,H,W);
}
}
return count;
}
function dfs(r,W) {
if (r < 0 || c < 0 || r === H || c === W) return;
if (grid[r][c] === '0') return;
grid[r][c] = '0';
dfs(r - 1,c);
dfs(r + 1,c);
dfs(r,c - 1);
dfs(r,c + 1);
}
}
是否与数组是如何通过引用或值传递有关,我对区别还是有点不清楚。谢谢! [1]:https://leetcode.com/problems/number-of-islands
解决方法
问题很可能是您在 grid
调用自身时没有传递 H
、W
和 dfs
:
dfs(r - 1,c);
dfs(r + 1,c);
dfs(r,c - 1);
dfs(r,c + 1);
错误意味着 grid
或 grid[r]
是 undefined
。如果您没有为参数显式传递值,则该参数将设置为 undefined
。
你也必须在那里传递这些值:
dfs(r - 1,c,grid,H,W);
dfs(r + 1,W);
dfs(r,c - 1,c + 1,W);