Skip to content

200. 岛屿数量


题目链接

https://leetcode.cn/problems/number-of-islands/description/

代码实现

java
class Solution {
    public static int[][] dir = { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } };

    public int numIslands(char[][] grid) {
        // n 行 m 列
        int n = grid.length;
        int m = grid[0].length;
        boolean[][] visited = new boolean[n][m];

        // 统计岛屿数量
        int cnt = 0;

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                // 遇到 '1' 就把相连的节点都标记,说明是一片岛屿
                // 之后的循环再次遇到 '1',则说明是一片新的岛屿
                if (!visited[i][j] && grid[i][j] == '1') {
                    // 优先处理该节点
                    visited[i][j] = true;
                    cnt++;
                    dfs(grid, i, j, visited);
                }
            }
        }

        return cnt;
    }

    // dfs 的作用是如果遇到 '1',则会把与 '1' 相连的所有节点标记
    public void dfs(char[][] grid, int x, int y, boolean[][] visited) {
        for (int i = 0; i < dir.length; i++) {
            int nextX = x + dir[i][0];
            int nextY = y + dir[i][1];

            // 检查越界
            if (nextX < 0 || nextX >= grid.length || nextY < 0 || nextY >= grid[0].length) {
                continue;
            }

            if (!visited[nextX][nextY] && grid[nextX][nextY] == '1') {
                visited[nextX][nextY] = true;
                dfs(grid, nextX, nextY, visited);
            }
        }
    }
}