leetcode热题岛屿数量

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

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

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

示例 1:

复制代码
输入:grid = [
  ['1','1','1','1','0'],
  ['1','1','0','1','0'],
  ['1','1','0','0','0'],
  ['0','0','0','0','0']
]
输出:1

示例 2:

复制代码
输入:grid = [
  ['1','1','0','0','0'],
  ['1','1','0','0','0'],
  ['0','0','1','0','0'],
  ['0','0','0','1','1']
]
输出:3
java 复制代码
 /**
     * 深度优先求岛屿个数
     * @param grid
     * @return
     */
    public int numIslands(char[][] grid) {
        int count = 0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == '1') {
                    deleteSideOne(grid,i,j);
                    count++;
                }
            }

        }

        return count;
    }

    /**
     * 广度优先岛屿个数
     * @param grid
     * @return
     */
    public int numIslands1(char[][] grid) {
        int count = 0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == '1') {
                    deleteSideOneDfs(grid,i,j);
                    count++;
                }
            }

        }

        return count;
    }

    private void deleteSideOneDfs(char[][] grid, int i, int j) {
        Queue<int[]> list = new LinkedList<>();
        list.add(new int[] {i,j});
        if (!list.isEmpty()) {
            int[] cur = list.remove();
            i = cur[0];j = cur[1];
            if (inArea(grid,i,j) && grid[i][j] == '1') {
                grid[i][j] = '0';
                list.add(new int[] {i+1,j});
                list.add(new int[] {i-1,j});
                list.add(new int[] {i,j+1});
                list.add(new int[] {i,j-1});
            }
        }
    }

    private void deleteSideOne(char[][] grid, int i, int j) {
        if (!inArea(grid,i,j) || grid[i][j] == '0') {
            return;
        }
        // 此时 = '1'
        grid[i][j] = '0';
        deleteSideOne(grid,i,j-1);
        deleteSideOne(grid,i,j+1);
        deleteSideOne(grid,i-1,j);
        deleteSideOne(grid,i+1,j);
    }

    /**
     * 岛屿的最大面积
     * @param grid
     * @return
     */
    public int maxAreaOfIsland(int[][] grid) {
      int res = 0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == 1) {
                    int tempA = area(grid,i,j);
                    res = Math.max(res,tempA);

                }
                
            }
            
        }
      
      
      return res;
    }

    private int area(int[][] grid, int i, int j) {
        // 超出网格,返回0
        if (!inArea(grid, i, j)) {
            return 0;
        }
        // 如果不是岛屿,返回0
        if (grid[i][j] != 1) {
            return 0;
        }
        // 递归计算相邻的是否岛屿(加上相邻的面积)
        return 1
                + area(grid, i - 1, j)
                + area(grid, i + 1, j)
                + area(grid, j, j - 1)
                + area(grid, i, j + 1);
    }

    private boolean inArea(int[][] grid, int i, int j) {
        return i >= 0 && i < grid.length && j >= 0 && j < grid[0].length;
    }

    private boolean inArea(char[][] grid, int i, int j) {
        return i >= 0 && i < grid.length && j >= 0 && j < grid[0].length;
    }
相关推荐
重生之我是Java开发战士7 分钟前
【贪心算法】柠檬水找零,将数组和减半的最少操作次数,最大数,摆动序列, 最长递增子序列,递增的三元子序列
算法·贪心算法
Godspeed Zhao8 分钟前
从零开始学AI17——SVM的数学支撑知识
算法·机器学习·支持向量机
我爱cope10 分钟前
【力扣hot100:53. 最大子数组和】
算法·leetcode·职场和发展
Dlrb12119 小时前
C语言-指针三
c语言·算法·指针·const·命令行参数
Tisfy9 小时前
LeetCode 2540.最小公共值:双指针(O(m+n))
算法·leetcode·题解·双指针
IronMurphy9 小时前
【算法四十七】152. 乘积最大子数组
算法
淘矿人11 小时前
Claude辅助DevOps实践
java·大数据·运维·人工智能·算法·bug·devops
Cosolar11 小时前
万字详解:RAG 向量索引算法与向量数据库架构及实战
数据库·人工智能·算法·数据库架构·milvus
小江的记录本11 小时前
【Java基础】泛型:泛型擦除、通配符、上下界限定(附《思维导图》+《面试高频考点清单》)
java·数据结构·后端·mysql·spring·面试·职场和发展
ychqsq11 小时前
20.面试
经验分享·职场和发展