【leetcode】1254.统计封闭岛屿的数目

73 阅读2分钟

leetcode-1254.png

题目简述:这一题在200题的基础之上进行了升级,升级点在,在边界上的陆地,不算岛屿,算大陆,只能算四面邻水的陆地算岛屿。这一题的岛屿还有陆地与200题不同0-岛屿1-大海

这一题的解题思路就跟200题一模一样了,没有丝毫的变动,只不过要对数据做下预处理,也就是处理那些大陆(非四面临水的陆地),也就是代码的15、20

DFS

var closedIsland = function (grid) {
    let res = 0
    let row = grid.length, col = grid[0].length
    var dfs = function (i, j) {
        if (i < 0 || i >= row || j < 0 || j >= col) return
        if (grid[i][j] === 1) return
        grid[i][j] = 1 // 淹没
        // 四个方向进行探索(淹没)
        dfs(i - 1, j)
        dfs(i + 1, j)
        dfs(i, j - 1)
        dfs(i, j + 1)
    }
    // 左右两边的陆地进行淹没
    for (let i = 0; i < row; ++i) {
        if (grid[i][0] === 0) dfs(i, 0)
        if (grid[i][col - 1] === 0) dfs(i, col - 1)
    }
    // 上下两边的陆地进行淹没
    for (let j = 0; j < col; ++j) {
        if (grid[0][j] === 0) dfs(0, j)
        if (grid[row - 1][j] === 0) dfs(row - 1, j)
    }
    for (let i = 0; i < row; ++i) {
        for (let j = 0; j < col; ++j) {
            if (grid[i][j] === 0) {
                dfs(i, j)
                res++
            }
        }
    }
    return res
};

BFS

淹没的操作一定不能忘

var closedIsland = function (grid) {
    let res = 0
    let row = grid.length, col = grid[0].length
    let directions = [[-1, 0], [1, 0], [0, -1], [0, 1]]
    var bfs = function (i, j) {
        grid[i][j] = 1 // 淹没
        let queue = [[i, j]]
        while (queue.length) {
            let [x, y] = queue.shift()
            // 4个方向上进行标记(淹没)
            for (let [dx, dy] of directions) {
                let fx = dx + x
                let fy = dy + y
                // 符合条件的进行标记
                if (fx >= 0 && fx < row && fy >= 0 && fy < col && grid[fx][fy] === 0) {
                    queue.push([fx, fy])
                    grid[fx][fy] = 1  // 淹没
                }
            }
        }
    }
    // 左右两边的陆地进行淹没
    for (let i = 0; i < row; ++i) {
        if (grid[i][0] === 0) bfs(i, 0)
        if (grid[i][col - 1] === 0) bfs(i, col - 1)
    }
    // 上下两边的陆地进行淹没
    for (let j = 0; j < col; ++j) {
        if (grid[0][j] === 0) bfs(0, j)
        if (grid[row - 1][j] === 0) bfs(row - 1, j)
    }
    for (let i = 0; i < row; ++i) {
        for (let j = 0; j < col; ++j) {
            if (grid[i][j] === 0) {
                bfs(i, j)
                res++
            }
        }
    }
    return res
};