200-岛屿的个数

题目描述

给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。

示例 1:

输入:
11110
11010
11000
00000

输出: 1

示例 2:

输入:
11000
11000
00100
00011

输出: 3

解题思路

找到一个值为'1'的点(岛屿),把该点地值置为'1',在它的周围(上下左右)继续(递归地)找值为'1'的点,同样,找到后就把该点的值置为'1',直到找不到值为'1'的点,这样就完成了一座岛屿的搜索,计数器加一。

对二维数组中的每一个点执行上述操作,完成后返回计数器的值,即为岛屿的数量。

源代码

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

private void dfs (char[][] grid, int i, int j) {
    if (i >= 0 && j >= 0 
        && i < grid.length 
        && j < grid[0].length 
        && grid[i][j] == '1') {
        grid[i][j] = '0';
        dfs(grid, i + 1, j);
        dfs(grid, i - 1, j);
        dfs(grid, i, j + 1);
        dfs(grid, i, j - 1);
    }
}

心得体会

最初看到这个题目,觉得跟《算法》第四版上的 1.5 节 Union-Find 比较像,但是要实现 UF 的数据结构,感觉比较麻烦,于是使用了 DFS 。


  转载请注明: yuzhenzero 200-岛屿的个数

 上一篇
17-电话号码的字母组合 17-电话号码的字母组合
题目描述给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 示例: 输入:"23" 输出:["ad", &qu
2019-01-18
下一篇 
230-二叉搜索树中第K小的元素 230-二叉搜索树中第K小的元素
题目描述给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。 说明:你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。 示例 1: 输入: root = [3,1,4,null,2], k
2019-01-16
  目录