Skip to content

dfs只用来标记是不是已经访问过了, 遍历所有的节点, 不要使用MAP, 所有的返回条件都放在递归结束的位置做

java
class Solution {
    /**
     * dfs只用来标记是不是已经访问过了, 遍历所有的节点, 不要使用MAP,
     * 所有的返回条件都放在递归结束的位置做
     */
    public int numIslands(char[][] grid) {
        boolean[][] visited = new boolean[grid.length][grid[0].length];
        int ans = 0;
        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(i, j, grid, visited);
                    ans++;
                }
            }
        }

        return ans;
    }

    private void dfs(int x, int y, char[][] grid, boolean[][] visited) {
        if (!inBounds(x, y, grid) || visited[x][y] || grid[x][y] != '1')
            return ;
        visited[x][y] = true;
        // 向四个方向探索
        dfs(x+1, y, grid, visited);
        dfs(x-1, y, grid, visited);
        dfs(x, y-1, grid, visited);
        dfs(x, y+1, grid, visited);
    }

    private boolean inBounds(int x, int y, char[][] matrix) { return
            x >= 0 && x < matrix.length &&
            y >= 0 && y < matrix[0].length;
    }
}

Personal Knowledge Base