我的js算法爬坑之旅-岛屿的周长

220 阅读1分钟

第二十三天:力扣第463题,岛屿的周长

地址:leetcode-cn.com/problems/is…

思路:一开始没思路,后来看了解析才有的,就是遍历,找是否有相邻的格子,不过这里有个点就是,不用找四个方向,只要判断两个方向就行,任何方向有格子就减2,这样就包括了那个格子的反方向了。

var islandPerimeter = function(grid) {
    let res = 0;
    for(let i = 0; i < grid.length; i++)
    {
        for(let j = 0; j < grid[i].length; j++)
        {
            if(grid[i][j] == 1)
            {
                res+=4;
                if(i != 0 && grid[i-1][j] == 1)
                {
                    res-=2;
                }
                if(j !=0 && grid[i][j-1] == 1)
                {
                    res-=2;
                }
            }    
        }
    }
    return res;
};
执行用时:232 ms, 在所有 JavaScript 提交中击败了28.18%的用户
内存消耗:47 MB, 在所有 JavaScript 提交中击败了20.80%的用户

题解给了一种深度优先搜索的方法,遍历的方式可扩展至统计多个岛屿各自的周长。需要注意的是为了防止陆地格子在深度优先搜索中被重复遍历导致死循环,我们需要将遍历过的陆地格子标记为已经遍历过,下面的代码中我们设定值为 2 的格子为已经遍历过的陆地格子。 

var islandPerimeter = function (grid) {
    const dx = [0, 1, 0, -1];
    const dy = [1, 0, -1, 0];
    const n = grid.length, m = grid[0].length;

    const dfs = (x, y) => {
        if (x < 0 || x >= n || y < 0 || y >= m || grid[x][y] === 0) {
            return 1;
        }
        if (grid[x][y] === 2) {
            return 0;
        }
        grid[x][y] = 2;
        let res = 0;
        for (let i = 0; i < 4; ++i) {
            const tx = x + dx[i];
            const ty = y + dy[i];
            res += dfs(tx, ty);
        }
        return res;
    }

    let ans = 0;
    for (let i = 0; i < n; ++i) {
        for (let j = 0; j < m; ++j) {
            if (grid[i][j] === 1) {
                ans += dfs(i, j);
            }
        }
    }
    return ans;
};  

不过这个方法的时间复杂度并没有减少,反而空间复杂度增加了。