LeetCode 岛屿数量(200题)DFS、BFS、并查集

本文介绍了LeetCode第200题岛屿数量的解题思路,包括使用深度优先搜索(DFS)、广度优先搜索(BFS)和并查集三种方法。通过遍历二维网格,将陆地连通部分标记并计数,得出岛屿数量。
摘要由CSDN通过智能技术生成

LeetCode 岛屿数量

@author:Jingdai
@date:2020.12.29

题目描述(200题)

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

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

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

示例 :

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

思路及代码

方法1 DFS和BFS

仔细阅读题目,可以发现其实题目就是求网格被 '0' 分成了几块,有几块就是有几个岛屿。如图,示例中的 '0' 将网格中的 '1' 分成了3块,结果就是3个岛屿。

在这里插入图片描述

根据此,我们可以对整个网格进行遍历,如果遇到 '1' ,就对它进行DFS或者BFS,将从它开始连通的 '1' 全部变成 '2' ,用 '2' 表示访问过的陆地。对网格遍历过程中,每新遇到一个 '1' ,表示一个新的岛屿,使岛屿数量加1。下面是具体代码。

DFS代码如下。

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

public void dfs(char[][] grid, int i, int j) {
   
    grid[i][j] = '2';
    int row = grid.length;
    int column = grid[0].length;
    // right  i    j+1
    // down   i+1  j
    // left   i    j-1
    // up     i-1  j

    if (j+1 <<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值