leetcode—图 岛屿数量

这篇具有很好参考价值的文章主要介绍了leetcode—图 岛屿数量。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

岛屿数量

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

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

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

leetcode—图 岛屿数量,leetcode,算法,职场和发展,java

 方法

深度优先遍历

网格问题的基本概念

leetcode—图 岛屿数量,leetcode,算法,职场和发展,java

leetcode—图 岛屿数量,leetcode,算法,职场和发展,java

leetcode—图 岛屿数量,leetcode,算法,职场和发展,java

避免重复遍历:

使用标记

以岛屿问题为例,我们需要在所有值为 1 的陆地格子上做 DFS 遍历。每走过一个陆地格子,就把格子的值改为 2,这样当我们遇到 2 的时候,就知道这是遍历过的格子了。也就是说,每个格子可能取三个值:

  • 0 —— 海洋格子
  • 1 —— 陆地格子(未遍历过)
  • 2 —— 陆地格子(已遍历过)

代码一

统计网格中字符 '1' 出现的次数

class Solution {
    // 深度优先遍历 参考二叉树的DFS  图/网格  四叉
    public int numIslands(char[][] grid) {
        // 定义count 用于统计岛屿的数量
        int count = 0;
        // 遍历网格
        for(int r = 0; r < grid.length; r++){
            for(int c = 0 ; c < grid[0].length; c++){
                // 若当前网格的值为“1”,则为陆地,遍历其的上下左右
                if(grid[r][c] == '1'){
                    // 调用递归函数
                    dfsHelp(grid, r, c);
                    // 统计岛屿数量 由多个陆地组成
                    count ++;
                }
            }
        }
        // 返回结果
        return count;
        
    }

    // 递归函数
    public void dfsHelp(char[][] grid, int row, int column){
        // 递归出口 防止网格越界
        if(row < 0 || column < 0 || (row >= 0 && row < grid.length) || (column >= 0 && column < grid[0].length)){
            return;
        }
        // 若网格为海洋 即值为"0"时 或者值为"2"时,也退出
        if(grid[row][column] == '0'|| grid[row][column] == '2'){
            return ;
        }
        // 将遍历过的陆地1 标记为2
        grid[row][column] = '2';

        // 递归遍历
        dfsHelp(grid, row - 1, column);   // 上
        dfsHelp(grid, row + 1, column);   // 下
        dfsHelp(grid, row, column -1);    // 左
        dfsHelp(grid, row, column +1);    // 右

    }
}

代码二

修改之后的代码文章来源地址https://www.toymoban.com/news/detail-822880.html

class Solution {
    // 深度优先遍历 参考二叉树的DFS  图/网格  四叉
    public int numIslands(char[][] grid) {
        // 首先对网格进行判空
        if(grid == null || grid.length == 0){
            return 0;
        }
        // 定义count 用于统计岛屿的数量
        int count = 0;
        // 遍历网格
        for(int r = 0; r < grid.length; r++){
            for(int c = 0 ; c < grid[0].length; c++){
                // 若当前网格的值为“1”,则为陆地,遍历其的上下左右
                if(grid[r][c] == '1'){
                    // 调用递归函数
                    dfsHelp(grid, r, c);
                    // 统计岛屿数量 由多个陆地组成
                    count ++;
                }
            }
        }
        // 返回结果
        return count;
        
    }
 
    // 递归函数
    public void dfsHelp(char[][] grid, int row, int column){
        // 递归出口 防止网格越界
        if(row < 0 || column < 0 || row >= grid.length || column >= grid[0].length){
            return;
        }
        // 若网格为海洋 即值为"0"时 或者值为"2"时,即值不等于1时 也退出
        if(grid[row][column] != '1'){
            return ;
        }
        // 将遍历过的陆地1 标记为2
        grid[row][column] = '2';
 
        // 递归遍历
        dfsHelp(grid, row - 1, column);   // 上
        dfsHelp(grid, row + 1, column);   // 下
        dfsHelp(grid, row, column -1);    // 左
        dfsHelp(grid, row, column +1);    // 右
 
    }
}

到了这里,关于leetcode—图 岛屿数量的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 岛屿数量 -- 二维矩阵的dfs算法

    岛屿数量 又被称为 FloodFill 算法

    2024年02月09日
    浏览(24)
  • 图论算法|深度优先搜索理论基础|797.所有可能的路径|广度优先搜索BFS理论基础|200. 岛屿数量

    dfs是可一个方向去搜,不到黄河不回头,直到遇到绝境了,搜不下去了,在换方向(换方向的过程就涉及到了回溯)。 递归和回溯是相辅相成的 https://leetcode.cn/problems/all-paths-from-source-to-target/ 有向无环图(DAG): 有环无向图是指在图中存在至少一个环(Cycle)的无向图。环是

    2024年02月15日
    浏览(45)
  • 图论第二天|岛屿数量.深搜版、岛屿数量.广搜版、岛屿的最大面积、1020.飞地的数量

    文档讲解 :代码随想录 - 岛屿数量.深搜版 状态:开始学习。 本题是dfs模板题 本题代码: 文档讲解 :代码随想录 - 岛屿数量.广搜版 状态:开始学习。 思路:bfs模板题 本题代码: 文档讲解 :代码随想录 - 岛屿的最大面积 状态:开始学习。 思路: 这道题目也是 dfs bfs 基础

    2024年02月08日
    浏览(27)
  • 16.3:岛屿数量问题2

    https://leetcode.cn/problems/number-of-islands-ii/ 给你一个大小为 m x n 的二进制网格 grid 。网格表示一个地图,其中, 0 表示水, 1 表示陆地。最初, grid 中的所有单元格都是水单元格(即,所有单元格都是 0 )。 可以通过执行 addLand 操作,将某个位置的水转换成陆地。给你一个数组

    2024年02月07日
    浏览(25)
  • 力扣200. 岛屿数量

    思路: 假设在 (r, c) 格子位置,r 为所处行,c 为所处的列; 遇到陆地格子之后,遍历搜索其上下左右周围的陆地格子,但是不能超出边界,即对应的数组下标不越界; 为了避免重复多次搜索,搜索到陆地格子之后将其标记染色; 四周搜索完所有的陆地格子,即为一个岛屿;

    2024年02月04日
    浏览(31)
  • C++面试宝典第20题:计算岛屿数量

    题目         在二维网格地图上,\\\'1\\\' 表示陆地,\\\'0\\\' 表示水域。如果相邻的陆地可以水平或垂直连接,则它们属于同一块岛屿。请进行编码,统计地图上的岛屿数量。比如:下面的二维网格地图,其岛屿数量为3。 解析         这道题主要考察应聘者对深度优先搜索、

    2024年01月18日
    浏览(24)
  • 力扣真题:200. 岛屿数量(两种实现方法)

     java代码实现: 用了类似感染的方法,就是一个节点出发,如果此时这个节点没被感染,且是陆地,就可以进入遍历,将其邻接的陆地全部遍历一遍,标志数组sign相应位置至为1.然后一次遍历一块陆地,能遍历几次就代表有几块陆地。 这种方法相较于第一种有了不错的优化

    2024年02月14日
    浏览(34)
  • 算法学习——LeetCode力扣图论篇3(127. 单词接龙、463. 岛屿的周长、684. 冗余连接、685. 冗余连接 II)

    127. 单词接龙 - 力扣(LeetCode) 描述 字典 wordList 中从单词 beginWord 和 endWord 的 转换序列 是一个按下述规格形成的序列 beginWord - s1 - s2 - … - sk: 每一对相邻的单词只差一个字母。 对于 1 = i = k 时,每个 si 都在 wordList 中。注意, beginWord 不需要在 wordList 中。 sk == endWord 给你两

    2024年04月09日
    浏览(66)
  • 代码随想录图论 第一天 | 797.所有可能的路径 200. 岛屿数量

    代码随想录图论 第一天 | 797.所有可能的路径 200. 岛屿数量 一、797.所有可能的路径 题目链接:https://leetcode.cn/problems/all-paths-from-source-to-target/ 思路:求从0到n-1的所有路径,终止条件是当前节点为n-1。本题图的结构是group[][],group[x]表示x节点所能到达的所有节点的集合,深度

    2024年02月08日
    浏览(38)
  • 代码随想录图论 第二天 | 695. 岛屿的最大面积 1020. 飞地的数量

    代码随想录图论 第二天 | 695. 岛屿的最大面积 1020. 飞地的数量 一、695. 岛屿的最大面积 题目链接:https://leetcode.cn/problems/max-area-of-island/ 思路:典型的遍历模板题,我采用深度优先,每块岛屿递归遍历的时候计数,递归完比较大小记录最大值。 二、1020. 飞地的数量 题目链接

    2024年02月07日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包