LeetCode热题--200. 岛屿数量--中等

1. 题目

给你一个由 '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

2. 题解

java 复制代码
class Solution {
    public int numIslands(char[][] grid) {
        int count = 0;
        for(int i = 0; i < grid.length; i++) {
            for(int j = 0; j < grid[0].length; j++) {
                if(grid[i][j] == '1'){
                    bfs(grid, i, j);
                    count++;
                }
            }
        }
        return count;
    }
    private void bfs(char[][] grid, int i, int j){
        Queue<int[]> list = new LinkedList<>();
        list.add(new int[] { i, j });
        while(!list.isEmpty()){
            int[] cur = list.remove();
            i = cur[0]; j = cur[1];
            if(0 <= i && i < grid.length && 0 <= j && j < grid[0].length && grid[i][j] == '1') {
                grid[i][j] = '0';
                list.add(new int[] { i + 1, j });
                list.add(new int[] { i - 1, j });
                list.add(new int[] { i, j + 1 });
                list.add(new int[] { i, j - 1 });
            }
        }
    }
}

3. 解析

出自:200. 岛屿数量(DFS / BFS)

public int numIslands(char\[\]\[\] grid) 是主函数,它接收一个二维字符数组作为输入参数。这个数组代表了一个地图,其中'0'表示水,'1'表示陆地。这个函数的目的是找出地图上有多少个独立的岛屿。

对于grid中的每一个单元格,代码都会检查它是否为'1'(代表陆地)。如果是,则会调用bfs(grid, i, j)函数来找出这个岛屿的所有连通单元格。

在numIslands函数中,每当找到一个新的'1'时,计数器count就会增加一。所以,count就是地图上独立岛屿的总数。

private void bfs(char\[\]\[\] grid, int i, int j)是一个辅助函数,它接收一个二维字符数组和两个整数作为参数。这个函数使用BFS算法来找出位于位置(i,j)的岛屿的所有连通单元格,并将这些单元格标记为'0',表示已经访问过。

在bfs(grid, i, j)函数中,首先创建一个队列list来存储下一步要处理的单元格。然后进入一个循环,只要列表不空,就会一直进行下去。在这个循环中,它会取出列表中的第一个单元格(使用remove方法),并检查这个单元格是否在地图范围内并且为'1',如果是,就将这个单元格标记为'0',然后将其上下左右的邻居加入到列表中。

最后返回count,即表示陆地的独立岛屿数量。

这段代码主要使用了广度优先搜索算法来解决问题,通过遍历地图上的每个单元格并找出所有连通的单元格(代表一个岛屿)来计算独立岛屿的数量。

相关推荐
LuminousCPP18 分钟前
数据结构-时间与复杂度|时间/空间复杂度 + 两道力扣练习 + 二分查找复盘
c语言·数据结构·经验分享·算法·leetcode
Nil20820 分钟前
leetcode 三数之和
数据结构·算法·leetcode
小小龙学IT40 分钟前
C++ std::vector 底层实现深度解析:内存布局、扩容策略、移动语义与迭代器失效
开发语言·c++·算法
eBest数字化转型方案1 小时前
从工程视角拆解冰柜资产管理:拍照识别 pipeline、纯净度算法与 IoT 选型踩坑
人工智能·物联网·算法
Interview Aid1121 小时前
Roblox OA 面经|小游戏+编程双修,Coding 两题满分通过
算法
闲研随记1 小时前
【文献阅读 ICLR 2026】RL算法:Co-Rewarding
算法
青山木1 小时前
Hot 100 --- 最小栈
java·数据结构·算法·leetcode
疯狂打码的少年1 小时前
【数据结构】栈的应用:表达式求值(后缀表达式)
java·数据结构·笔记·算法
HiDev_2 小时前
【非标自动化】plc执行顺序问题、扫描周期问题
深度学习·算法·机器学习
高洁012 小时前
工信部教考中心证书-人工智能系列本系列
人工智能·python·深度学习·算法