LeetCode Logo

200. 岛屿数量

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

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

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

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

示例 1:

输入:grid = [
  ['1','1','1','1','0'],
  ['1','1','0','1','0'],
  ['1','1','0','0','0'],
  ['0','0','0','0','0']
]
输出:1

示例 2:

输入:grid = [
  ['1','1','0','0','0'],
  ['1','1','0','0','0'],
  ['0','0','1','0','0'],
  ['0','0','0','1','1']
]
输出:3

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 300
  • grid[i][j] 的值为 '0' 或 '1'

思路:遍历二维数组并用递归方法DFS数组,遇到陆地则DFS设置成海水,避免重复访问陷入死循环

C#实现:

public class Solution {
    public int NumIslands(char[][] grid) {
        int res = 0;
        int m = grid.Length;
        int n = grid[0].Length;
        for(int i=0; i<m; i++) {
            for(int j=0; j<n; j++) {
                // 若是陆地则计数,并DFS淹没其相邻的陆地
                if(grid[i][j] == '1') {
                    res++;
                    DFS(grid, i, j);
                }
            }
        }
        return res;
    }
    private void DFS(char[][] grid , int i, int j) {
        int m = grid.Length;
        int n = grid[0].Length;
        // 边界检查
        if(i<0 || i>=m || j <0 || j>=n) return;
        // 若是海水
        if(grid[i][j] == '0') return;
        // 访问过得设置成海水,防止重复访问
        grid[i][j] = '0';
        // 上下左右DFS
        DFS(grid, i-1, j);
        DFS(grid, i+1, j);
        DFS(grid, i, j-1);
        DFS(grid, i, j+1);
    }
}

Subscribe for New Articles!

Leave a Comment

Your email address will not be published. Required fields are marked *