力扣 #200岛屿数量 (深度优先遍历+沉岛思想)

# 200 岛屿数量

给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。

岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。

此外,你可以假设该网格的四条边均被水包围。
示例 1:

输入:
11110
11010
11000
00000
输出: 1

示例 2:

输入:
11000
11000
00100
00011
输出: 3
解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。

思路

1. 沉岛思想

在深度遍历时,每遇到一个相连的岛屿,就将其沉底,使其不再是岛屿,这样就避免遍历时重复计数。

2. DFS 深度优先搜索

此题是计算相邻的岛屿,要想知道岛屿是不是相邻的,深度遍历即可,递归地遍历上下左右。

代码

class Solution {
    public int numIslands(char[][] grid) {
        int cnt = 0;
        //两重循环遍历每个节点
        for(int i = 0; i < grid.length; i++){
            for(int j = 0; j < grid[0].length; j++){
                //判断节点,如果是1,就深度遍历。
                if(grid[i][j] == '1'){
                    change(grid,i,j);
                    cnt++;
                }
            }
        }
        return cnt;
    }
    //将遍历过的岛屿标记为2,标记为0也行.
    //只要不是1,主函数遍历时就不会重复计数。
    public void change(char[][] grid, int i, int j){
        if(i<0 || i>=grid.length||j<0||j>=grid[0].length||grid[i][j] != '1') return;
        grid[i][j] = '2';
        //上下左右去改变相邻的岛屿
        change(grid,i+1,j);
        change(grid,i-1,j);
        change(grid,i,j+1);
        change(grid,i,j-1);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章