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;
    }
相关推荐
weisian15139 分钟前
Java并发编程--47-分布式ID生成器:雪花算法(Snowflake)与时钟回拨问题
java·算法·时钟回拨·雪花算法id
itzixiao40 分钟前
L1-066 猫是液体(5分)[java][python]
java·开发语言·python·算法
ytttr87341 分钟前
MATLAB SIFT图像配准实现
算法·机器学习·matlab
小饕44 分钟前
从 Word2Vec 到多模态:词嵌入技术的演进全景
人工智能·算法·机器学习
海参崴-1 小时前
AVL树完整实现与深度解析
算法
一个爱编程的人1 小时前
一个数是不是素数
数据结构·算法
Hui_AI7201 小时前
基于RAG的农产品GEO溯源智能问答系统实现
开发语言·网络·人工智能·python·算法·创业创新
lwf0061641 小时前
FFM (Field-aware Factorization Machine) 学习日记
算法·机器学习
南宫萧幕1 小时前
HEV能量管理控制算法实战:从MPC/RL理论基础到Simulink闭环建模
算法·matlab·汽车·控制·pid
IT猿手1 小时前
SCI一区:章鱼优化算法(Octopus Optimization Algorithm, OOA)求解23个测试函数,出图丰富,提供完整MATLAB代码
开发语言·算法·matlab