首页 > 其他分享 >【代码随想录Day50】图论Part02

【代码随想录Day50】图论Part02

时间:2024-10-23 20:22:09浏览次数:3  
标签:int 岛屿 Part02 随想录 dfs ++ length grid Day50

岛屿数量 深搜

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

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;
    }
}

标签:int,岛屿,Part02,随想录,dfs,++,length,grid,Day50
From: https://blog.csdn.net/weixin_43724673/article/details/143192974

相关文章

  • 代码随想录第七天
    454.四数相加II给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+nums4[l]==0示例1:输入:nums1=[1,2],nums2=[-2,-1],nums3=[-1,2],nums4=[0,......
  • 代码随想录刷题学习日记
    仅为个人记录复盘学习历程,解题思路来自代码随想录代码随想录刷题笔记总结网址:代码随想录二叉树理论基础学习二叉树有两种主要的形式:满二叉树和完全二叉树。满二叉树:只有度为0的结点和度为2的结点,且度为0的结点在同一层的二叉树。深度为k,有2^k-1个节点。完全二叉树:除了最......
  • 代码随想录-环形链表II
    题目与解析    题目链接:环形链表II本题两个关键点,1、确定有环2、确定环的入口位置 提供两种解法,第一种是我借助了一个辅助的列表来记录指针,空间复杂度O(n)比较无脑 第二种是Carl哥的双指针法,又是套圈问题,虽然很难想,但还是推荐这种方式,这才是算法解法一:publ......
  • 代码随想录-链表相交
    题解与说明要注意区分链表相交是指针相等,而不是值相等。这里当时没有想清楚,还以为leetcode的样例一给错了,原来人家是想强调这个问题哈哈这里给出三种解法:(leetcode格式)①看了代码随想录的解释后,自己写的代码。②看了代码随想录的代码后,对原有的代码循环进行优化。③......
  • 代码随想录算法训练营第八天|leetcode344.反转字符串、leetcode541. 反转字符串II、卡
    1leetcode344.反转字符串题目链接:344.反转字符串-力扣(LeetCode)文章链接:代码随想录视频链接:字符串基础操作!|LeetCode:344.反转字符串_哔哩哔哩_bilibili自己的思路:直接使用python的内置函数reverse进行一个操作1.1自己的代码1.1.1python的内置函数classSolution:......
  • 代码随想录算法训练营day22和day23 | 77. 组合 216.组合总和III 17.电话号码的字母
    学习资料:https://programmercarl.com/回溯算法理论基础.html回溯法backtracking:for循环控制递归数量,暴力搜索:组合、切割、子集、排列、棋盘今天学了组合和切割可以画个N叉树的图来帮助理解回溯过程组合又包括1.单个数组(要加startIndex参数)或多个数组;2.数组内有无重复元素;3.数......
  • 代码随想录算法训练营 | 图论理论基础,98. 所有可达路径
    图论理论基础1.图的种类:有向图,无向图,加权有向图,加权无向图;2.度:无向图中有几条边连接该节点,该节点就有几度,在有向图中,每个节点有出度和入度;出度:从该节点出发的边的个数;入度:指向该节点边的个数;3.连通图:在无向图中,任何两个节点都是可以到达的;强连通图:在有向图中,任何两个节点是可以......
  • 代码随想录算法训练营Day42 | 完全背包理论基础、518.零钱兑换II、377. 组合总和 Ⅳ、
    目录完全背包理论基础518.零钱兑换II377.组合总和Ⅳ卡玛网57.爬楼梯(进阶版)完全背包理论基础题目52.携带研究材料(第七期模拟笔试)题目描述:小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间......
  • 代码随想录算法训练营第七天|leetcode454.四数相加II、leetcode383. 赎金信 、leetcod
    1leetcode454.四数相加II题目链接:454.四数相加II-力扣(LeetCode)文章链接:代码随想录视频链接:学透哈希表,map使用有技巧!LeetCode:454.四数相加II_哔哩哔哩_bilibili自己的思路:第一反应就是暴力搜索,一层一层for循环来完成,就是会超时1.1自己的代码纯纯暴力搜索classSolutio......
  • 代码随想录算法训练营Day39 | 卡玛网-46.携带研究材料、416. 分割等和子集
    目录卡玛网-46.携带研究材料416.分割等和子集卡玛网-46.携带研究材料题目卡玛网46.携带研究材料(第六期模拟笔试)题目描述:小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包......