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;
    }
相关推荐
Yuzhiyuxia7 小时前
【AI Agent面试系列】AI Agent记忆机制知识点1
人工智能·面试·职场和发展
UIU1147 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场8 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi8 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
秋天的怀念_David9 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院10 小时前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
niyongsheng10 小时前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
j7~13 小时前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
傅科摆 _ py13 小时前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法
Shaoshing14 小时前
LeetCode100 42.接雨水
java·算法·leetcode