200. 岛屿数量

image.png

解法

图类联通性问题,可以用深度优先遍历,往4个方向进行遍历,直到越界,或者找到的元素不是1,或者节点已经访问过,进行返回。

class Solution {
    public int numIslands(char[][] grid) {
        int res = 0;
        boolean[][] visited = new boolean[grid.length][grid[0].length];    
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == '1' && !visited[i][j]) {
                    dfs(grid, visited, i, j);
                    res++;
                }                   
            }
        }
        return res;
    }

    private void dfs(char[][] grid, boolean[][] visited, int i, int j) {
        // 坐标越界
        if (i >= grid.length || i < 0) {
            return;
        }                
        if (j >= grid[0].length || j < 0) {
            return;
        }
        // 不等于1或者之前已经访问过
        if (grid[i][j] != '1' || visited[i][j]) {
            return;
        }
        visited[i][j] = true;
        // 上下左右,四个不同的方向进行遍历
        int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        for (int[] dir : dirs) {
            dfs(grid, visited, i + dir[0], j + dir[1]);
        }
    }
}

做另外一个题时,发现有更简单的方法,不需要再用visited数组,直接把遇到的1改为0即可。

class Solution {
    public int numIslands(char[][] grid) {
        int res = 0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == '1') {
                    dfs(grid, i, j);
                    res++;
                }                   
            }
        }
        return res;
    }

    private void dfs(char[][] grid, int i, int j) {
        if (i >= grid.length || i < 0) {
            return;
        }                
        if (j >= grid[0].length || j < 0) {
            return;
        }
        // 不等于1
        if (grid[i][j] != '1') {
            return;
        }
        // 直接改为0,不用再用额外的数组了
        grid[i][j] = '0';
        // 上下左右
        int[][] dirs = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
        for (int[] dir : dirs) {
            dfs(grid, i + dir[0], j + dir[1]);
        }
    }
}

你可能感兴趣的:(200. 岛屿数量)