• leetcode 200. 岛屿数量 java


    题目:

    给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。

    示例 1:

    输入:
    11110
    11010
    11000
    00000

    输出: 1
    示例 2:

    输入:
    11000
    11000
    00100
    00011

    输出: 3

    解题:

    思路一:DFS

    直觉

    将二维网格看成一个无向图,竖直或水平相邻的 1 之间有边。

    算法

    线性扫描整个二维网格,如果一个结点包含 1,则以其为根结点启动深度优先搜索。在深度优先搜索过程中,每个访问过的结点被标记为 0。计数启动深度优先搜索的根结点的数量,即为岛屿的数量。

    class Solution {
        void dfs(char[][] grid, int r, int c) {
            int nr = grid.length;
            int nc = grid[0].length;
            if (r < 0 || c < 0 || r >= nr || c >= nc || grid[r][c] == '0') {
                return;
            }
            grid[r][c] = '0';//将原本为1的元素修改为'0'
            dfs(grid, r - 1, c); //遍历上下左右四个方向
            dfs(grid, r + 1, c);
            dfs(grid, r, c - 1);
            dfs(grid, r, c + 1);
        }
    
        public int numIslands(char[][] grid) {
            if (grid == null || grid.length == 0) {
                return 0;
            }
            int nr = grid.length;
            int nc = grid[0].length;
            int num_islands = 0;
            for (int r = 0; r < nr; ++r) {
                for (int c = 0; c < nc; ++c) {
                    if (grid[r][c] == '1') {
                        ++num_islands;
                        dfs(grid, r, c);//将‘1’周边的‘1’修改为‘0’
                    }
                }
            }
            return num_islands;
        }
    }

    思路二:BFS

    算法

    线性扫描整个二维网格,如果一个结点包含 1,则以其为根结点启动广度优先搜索。将其放入队列中,并将值设为 0 以标记访问过该结点。迭代地搜索队列中的每个结点,直到队列为空。

    class Solution {
        public int numIslands(char[][] grid) {
            if (grid == null || grid.length == 0) {
                return 0;
            }
            int nr = grid.length;
            int nc = grid[0].length;
            int num_islands = 0;
            for (int r = 0; r < nr; ++r) {
                for (int c = 0; c < nc; ++c) {
                    if (grid[r][c] == '1') {
                        ++num_islands;
                        bfs(grid, r, c);
                    }
                }
            }
            return num_islands;
        }
        //广度优先搜索
        void bfs(char[][] grid, int r, int c) {
            int nr = grid.length;
            int nc = grid[0].length;
            if (r < 0 || c < 0 || r >= nr || c >= nc || grid[r][c] == '0') {
                return;
            }
            grid[r][c] = '0';//将原本为1的元素修改为'0'
            Queue<Integer> bfsQueue = new LinkedList<>();
            bfsQueue.add(r * nc + c);
            while (!bfsQueue.isEmpty()) {
                int id = bfsQueue.remove();
                int row = id / nc;
                int col = id % nc;
                if (row - 1 >= 0 && grid[row - 1][col] == '1') {
                    bfsQueue.add((row - 1) * nc + col);
                    grid[row - 1][col] = '0';
                }
                if (row + 1 < nr && grid[row + 1][col] == '1') {
                    bfsQueue.add((row + 1) * nc + col);
                    grid[row + 1][col] = '0';
                }
                if (col - 1 >= 0 && grid[row][col - 1] == '1') {
                    bfsQueue.add(row * nc + col - 1);
                    grid[row][col - 1] = '0';
                }
                if (col + 1 < nc && grid[row][col + 1] == '1') {
                    bfsQueue.add(row * nc + col + 1);
                    grid[row][col + 1] = '0';
                }
            }
        }
    }

     

    链接:https://leetcode-cn.com/problems/number-of-islands/solution/dao-yu-shu-liang-by-leetcode/


  • 相关阅读:
    扩展IList对象,实现深拷贝扩展方法
    Repeater 汇总某一列(序号,分页) 最简单方法
    Query siblings()
    C#中求两个日期相差的年月日时分秒
    SQL语句中的 "... like '%@strKeyword% ' "这样写查不出结果
    sql server 编辑前200行..编辑前N行配置..
    .Net读取Excle数据写入到数据库
    jquery设置元素的readonly和disabled
    页面有ScriptManager , UPdatepanel 有些错误不报错...的解决方法
    一次性删除数据库所有表和所有存储过程 SQL语句
  • 原文地址:https://www.cnblogs.com/yanhowever/p/11853508.html
Copyright © 2020-2023  润新知