当前位置: 首页 > article >正文

【代码随想录Day50】图论Part02

岛屿数量 深搜

题目链接/文章讲解:代码随想录

class Solution {
    // 计算网格中岛屿的数量
    public int numIslands(char[][] grid) {
        int sum = 0;  // 初始化岛屿数量为0

        // 遍历整个网格
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                // 如果当前单元格是陆地('1'),则表示发现了一个新的岛屿
                if (grid[i][j] == '1') {
                    sum++;  // 增加岛屿计数
                    dfs(grid, i, j);  // 使用深度优先搜索(DFS)标记整个岛屿
                }
            }
        }

        return sum;  // 返回岛屿的总数
    }

    // 深度优先搜索,用于标记连接的陆地
    public void dfs(char[][] grid, int i, int j) {
        // 如果索引越界或当前单元格是水('0'),则返回
        if (i < 0 || i > grid.length - 1 || j < 0 || j > grid[0].length - 1 || grid[i][j] == '0') {
            return;
        }

        // 将当前单元格标记为水('0'),表示已经访问过
        grid[i][j] = '0';

        // 递归地检查四个方向(上、下、左、右)的相邻单元格
        dfs(grid, i - 1, j);  // 上
        dfs(grid, i + 1, j);  // 下
        dfs(grid, i, j - 1);  // 左
        dfs(grid, i, j + 1);  // 右
    }
}

岛屿数量 广搜

题目链接/文章讲解:代码随想录

class Solution {
    public int numIslands(char[][] grid) {
        // 创建一个队列用于BFS
        Queue<int[]> queue = new LinkedList<>();
        // 初始化岛屿数量
        int sum = 0;

        // 遍历整个网格
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                // 如果当前位置是陆地('1')
                if (grid[i][j] == '1') {
                    // 发现一个新的岛屿,岛屿数量加一
                    sum++;
                    // 将当前位置加入队列,并标记为已访问('0')
                    queue.add(new int[]{i, j});
                    grid[i][j] = '0';

                    // 开始BFS
                    while (!queue.isEmpty()) {
                        // 从队列中取出一个位置
                        int[] cur = queue.poll();
                        int x = cur[0];
                        int y = cur[1];

                        // 检查上方的位置
                        if (x - 1 >= 0 && grid[x - 1][y] == '1') {
                            queue.add(new int[]{x - 1, y});
                            grid[x - 1][y] = '0'; // 标记为已访问
                        }
                        // 检查下方的位置
                        if (x + 1 < grid.length && grid[x + 1][y] == '1') {
                            queue.add(new int[]{x + 1, y});
                            grid[x + 1][y] = '0'; // 标记为已访问
                        }
                        // 检查左边的位置
                        if (y - 1 >= 0 && grid[x][y - 1] == '1') {
                            queue.add(new int[]{x, y - 1});
                            grid[x][y - 1] = '0'; // 标记为已访问
                        }
                        // 检查右边的位置
                        if (y + 1 < grid[0].length && grid[x][y + 1] == '1') {
                            queue.add(new int[]{x, y + 1});
                            grid[x][y + 1] = '0'; // 标记为已访问
                        }
                    }
                }
            }
        }
        // 返回岛屿的总数量
        return sum;
    }
}

岛屿的最大面积

题目链接/文章讲解:代码随想录

class Solution {
    // 主方法,用于计算二维网格中最大的岛屿面积
    public int maxAreaOfIsland(int[][] grid) {
        int max_area = 0; // 初始化最大岛屿面积为0

        // 遍历整个二维网格
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                // 如果当前格子是岛屿(值为1)
                if (grid[i][j] == 1) {
                    // 使用深度优先搜索计算当前岛屿的面积
                    int area = dfs(grid, i, j);
                    // 更新最大岛屿面积
                    max_area = Math.max(max_area, area);
                }
            }
        }

        return max_area; // 返回最大岛屿面积
    }

    // 深度优先搜索方法,用于计算岛屿的面积
    public int dfs(int[][] grid, int i, int j) {
        // 检查当前格子是否越界或是否是水域(值为0)
        if (i < 0 || i >= grid.length || j < 0 || j >= grid[0].length || grid[i][j] == 0) {
            return 0; // 如果是越界或水域,返回面积为0
        }

        grid[i][j] = 0; // 将当前格子标记为已访问(值设为0)

        // 递归计算当前格子上、下、左、右四个方向的岛屿面积
        int up = dfs(grid, i - 1, j); // 上
        int down = dfs(grid, i + 1, j); // 下
        int left = dfs(grid, i, j - 1); // 左
        int right = dfs(grid, i, j + 1); // 右

        // 返回当前格子的面积(1)加上四个方向的面积之和
        return 1 + up + down + left + right;
    }
}

http://www.kler.cn/news/362119.html

相关文章:

  • 大数据开发电脑千元配置清单
  • 基于springboot家乡特色推荐系统
  • 算法Day-7
  • 出血性脑卒中临床智能诊疗建模
  • 【C++指南】类和对象(四):类的默认成员函数——全面剖析 : 拷贝构造函数
  • Leetcode—1279. 红绿灯路口【简单】Plus(多线程)
  • java语言知识点(1)
  • Selenium:设置元素等待、上传文件、下载文件
  • 数字化转型中的IT价值:如何让管理层相信“钱花得值”?
  • 如何判断一个数是几位数与这个数是否为回文数并打印出其逆序数
  • 为何大家都对谷歌老号白包趋之若鹜
  • 从零开始学PHP之helloworld
  • 计算套餐续订率:梧桐数据库与`oracle`实现`SQL`的细微差异分析
  • C++运算出现整型溢出
  • Opensearch集群部署【docker、服务器、Helm多种部署方式】
  • LeetCode 142 - 环形链表 II
  • 动态规划19:53. 最大子数组和
  • solidworks管理员运行install.bat提示[sC]0penService 失败 5:拒绝访问。请按任意键继续...
  • YOLO11改进 | 注意力机制 | 添加SE注意力机制
  • U盘文件删除后的全面恢复指南
  • 纯css实现瀑布流! 附源码!!!
  • Android Studio Gradle版本、插件以及Android API对应关系(持续更新)
  • 二百六十八、Kettle——同步ClickHouse清洗数据到Hive的DWD层静态分区表中(每天一次)
  • docker 误删gitlab文件,另类的删库跑路,如何进行恢复?
  • css 不管目录结构层级。父元素有很多块子元素,孙子元素。希望从左往右从上往下排列
  • MySQL程序介绍<二>