岛屿数量

题目链接:

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

问题描述:

给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。

示例 1:

输入:
[
['1','1','1','1','0'],
['1','1','0','1','0'],
['1','1','0','0','0'],
['0','0','0','0','0']
]
输出: 1
示例 2:

输入:
[
['1','1','0','0','0'],
['1','1','0','0','0'],
['0','0','1','0','0'],
['0','0','0','1','1']
]
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

代码实现:

class Solution {

    char[][] g;
    public int numIslands(char[][] grid) {
        int island = 0;
        g  = grid;
        for(int i = 0; i < grid.length;i++){
            for(int j = 0; j < grid[i].length;j++){
                island += sink(i,j);
            }
        }
        return island;
    }
    int[] dx = new int[]{-1,1,0,0};
    int[] dy = new int[]{0,0,-1,1};
    
    public int sink(int i,int j){
        if(g[i][j]=='0'){
            return 0;
        }
        g[i][j] = '0';
        for(int k = 0; k < dx.length; k++){
            int x = i+dx[k],y = j+dy[k];
            if(x >= 0 && x<g.length && y>=0 && y<g[i].length){
                sink(x,y);
            }
        }
        return 1;
    }
}

解题思路:

对于连接在一起的1我们认定其为一个岛屿,因此我们可以使用深度优先搜索的思路解决本问题,我们顺序遍历二维数组,当遍历到1时以此为根节点进行深度优先遍历搜索,对于搜索到的1我们做一下标记将其值变为0,直到遍历完所有的相连接的所有为1的节点,然后遍历下一个独立为1 的节点,每开始一次深度优先搜索我们就认为找到一个岛屿。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。