LeetCode Q200的离岛数量

时间:2019-05-25 17:39:30

标签: javascript algorithm data-structures

我正在尝试做Q.200。关于Leetcode的离岛数量问题。该问题的内容如下:

  

给出一个二维地图,分别是“ 1”(土地)和“ 0”(水),计算岛屿的数量。一个岛屿被水包围,是通过水平或垂直连接相邻的陆地而形成的。您可能会假设网格的所有四个边缘都被水包围了。

Example 1:

Input:
11110
11010
11000
00000

Output: 1


Example 2:

Input:
11000
11000
00100
00011

Output: 3

以下是我在JavaScript中的解决方案:

/**
 * @param {character[][]} grid
 * @return {number}
 */
var numIslands = function(grid) {
    if (grid.length == 0) {
      return 0;
    }

    var count = 0;

    var z = new Array(grid[0].length).fill(0);
    var visit = new Array(grid.length);

    for (i = 0; i < visit.length; i++) {
        visit[i] = z;
    }

    function traverse(x, y, grid, visit, count) {
        var col = grid.length;
        var row = grid[0].length;
        if (x >= 0 && y >= 0 && x < row && y < col) {
            visit[x][y] = 1;
        } else {
            return;
        }
        if (grid[x][y] != 1) {
            return;
        } else {
            traverse(x + 1, y);
            traverse(x - 1, y);
            traverse(x, y + 1);
            traverse(x, y - 1);
            count++;
        }
    }

    for (i = 0; i < grid.length; i++) {
        for (j = 0; j < grid[0].length; j++) {
            if (visit[i][j] == 0) {
                traverse(i, j, grid, visit, count);
            } else {
                continue;
            }
        }
    }

    return count;
};

基本上,我要尝试的是在值是1时调用递归,在无处可走时(孤岛的末端)停止,然后将孤岛数增加1。我创建了一个0数组检查是否访问过该位置。如果通过for循环或递归访问它,则它变成1,否则它是0。

错误

Line 20 in solution.js
         var col = grid.length;

TypeError: Cannot read property 'length' of undefined

有人可以帮我指出我的错误吗?我整个上午都在努力找出解决方案的问题。

最诚挚的问候。

2 个答案:

答案 0 :(得分:0)

在第30-33行中,您发现以下内容似乎是错误的:

        traverse(x + 1, y);
        traverse(x - 1, y);
        traverse(x, y + 1);
        traverse(x, y - 1);

相反,您可以添加

        traverse(x + 1, y, grid, visit, count);
        traverse(x - 1, y, grid, visit, count);
        traverse(x, y + 1, grid, visit, count);
        traverse(x, y - 1, grid, visit, count);

答案 1 :(得分:0)

您应该检查遍历功能开始时是否访问过该节点。

if (x >= 0 && y >= 0 && x < row && y < col) {
    //////////////////////
    if (visit[x][y] == 1){
        return;
    }
    //////////////////////
    visit[x][y] = 1;
} else {
    return;
}