2025年- H56-Lc164--200.岛屿数量(图论,深搜)--Java版

1.题目描述

2.思路

(1)主函数,存储图结构

(2)主函数,visit数组表示已访问过的元素

(3)辅助函数,用递归(深搜),遍历以已访问过的元素(陆地1)的相邻元素(陆地1)。

补充:深度搜索(递归)

(1)确定递归函数和参数

(2)确定终止条件

(3)单层搜索条件

3.代码实现

java 复制代码
   public int numIslands(char[][] grid) {
        //行数
        int row = grid.length;

        //列数
        int col = grid[0].length;

        // visited 用于记录访问状态
        boolean[][] visited = new boolean[row][col];//所有数组的元素在创建时都会被自动初始化为默认值。

        //岛屿数量初始化
        int cnt = 0;

        //判空处理,整个图为null,行为0,列为0
        if (row == 0 || col == 0 || grid == null) {
            return 0;
        }


        //存储图结构
        for (int i = 0; i < row; i++) {
            for (int j = 0; j < col; j++) { // 如果当前是陆地且未被访问
                if (grid[i][j] == '1' && visited[i][j] == false)
                //!visited[i][j] 和visited[i][j]==false 等同
                {
                    cnt++;

                    dfs(grid, visited, i, j);// 每次DFS表示一个岛屿

                }
            }
        }
        return cnt;

    }

    // 深度优先搜索,将与当前位置相连的陆地都标记为已访问
    void dfs(char[][] grid, boolean visited[][], int i, int j) {
        int row = grid.length;
        int col = grid[0].length;

        // 越界或不是陆地或已访问,直接返回,切记因为索引是从0开始的,所以i>=row||j>=col
        if (i < 0 || j < 0 || i >= row || j >= col || visited[i][j] == true || grid[i][j] == '0') {
            return;
        }
        // 标记为已访问,把访问过的陆地的相邻陆地标记为已访问过
        visited[i][j] = true;
        dfs(grid, visited, i + 1, j);
        dfs(grid, visited, i - 1, j);
        dfs(grid, visited, i, j + 1);
        dfs(grid, visited, i, j - 1);


    }

    public static void main(String[] args) {
        H200 test = new H200();
        char[][] input = {
                {'1', '1', '1', '1', '0'},
                {'1', '1', '0', '1', '0'},
                {'1', '1', '0', '0', '0'},
                {'0', '0', '0', '0', '0'}

        };
        int numsIsland = test.numIslands(input);
        System.out.print(numsIsland);
        
    }
相关推荐
程序员清风16 小时前
程序员兼职必看:靠谱软件外包平台挑选指南与避坑清单!
java·后端·面试
皮皮林55117 小时前
利用闲置 Mac 从零部署 OpenClaw 教程 !
java
华仔啊1 天前
挖到了 1 个 Java 小特性:var,用完就回不去了
java·后端
SimonKing1 天前
SpringBoot整合秘笈:让Mybatis用上Calcite,实现统一SQL查询
java·后端·程序员
日月云棠2 天前
各版本JDK对比:JDK 25 特性详解
java
用户8307196840822 天前
Spring Boot 项目中日期处理的最佳实践
java·spring boot
JavaGuide2 天前
Claude Opus 4.6 真的用不起了!我换成了国产 M2.5,实测真香!!
java·spring·ai·claude code
IT探险家2 天前
Java 基本数据类型:8 种原始类型 + 数组 + 6 个新手必踩的坑
java
花花无缺2 天前
搞懂new 关键字(构造函数)和 .builder() 模式(建造者模式)创建对象
java
用户908324602732 天前
Spring Boot + MyBatis-Plus 多租户实战:从数据隔离到权限控制的完整方案
java·后端