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;
    }
相关推荐
好易学·数据结构2 小时前
可视化图解算法75:最长上升子序列(最长递增子序列)
数据结构·算法·leetcode·动态规划·力扣·牛客网
闻缺陷则喜何志丹2 小时前
【组合数学 动态规划】P6870 [COCI2019-2020#5] Zapina|普及+
c++·数学·算法·动态规划·组合数学
zl_vslam2 小时前
SLAM中的非线性优-3D图优化之相对位姿Between Factor-SO3/t形式(十一)
人工智能·算法·计算机视觉·3d
aini_lovee2 小时前
基于 OpenCV 的模板匹配算法的 C 语言实现
c语言·opencv·算法
core5122 小时前
EM 算法 (期望最大化):在迷雾中寻找真相
算法·em·期望最大化
CoovallyAIHub2 小时前
YOLO11-4K:面向4K全景图像的高效实时检测框架,CVIP360数据集开源
深度学习·算法·计算机视觉
安_2 小时前
java Arrays.sort 用的什么算法
java·算法·排序算法
蓝色汪洋2 小时前
数字(加强版)
算法
进击的小头2 小时前
02_嵌入式C与控制理论入门:自动控制理论核心概念拆解
c语言·单片机·算法