图论part2|200. 岛屿数量、695. 岛屿的最大面积

200、岛屿数量

  • 🔗:200. 岛屿数量 - 力扣(LeetCode)

  • 思路:

      1. 深度优先算法
      • 二叉树中dfs要素:1、访问左右相邻子节点 2、判断base case(终止条件)
      • 参考二叉树中的dfs看网格问题
        1. 网格的相邻节点:上下左右4个
      • 2.终止条件:超出格子的范围(--对应二叉树中全部为null的base case)
        1. 关键!!避免重复遍历,做过的格子需要进行标记
      1. 广度优先算法
      • 扫描整个二维网格,遇到为1的格子,加入队列当中,进行广度搜索
  • 代码

    • 深度优先算法
    java 复制代码
    class Solution {
    
        public int numIslands(char[][] grid) {
            int area = 0;
            for(int i=0; i<grid.length; i++){
                for(int j=0; j<grid[0].length; j++){
                    if(grid[i][j] == '1'){
                        area++;
                        dfs(grid, i, j);
                    }
                }
            }
            return area;
        }
    
        private void dfs(char[][] grid, int r, int c){
            if(!isArea(grid,r,c)){
                return;
            }
            if(grid[r][c] != '1'){
                return;
            }
            grid[r][c] = '2';
    
            dfs(grid, r-1, c);
            dfs(grid, r, c-1);
            dfs(grid, r+1, c);
            dfs(grid, r, c+1);
        }
    
        boolean isArea(char[][] grid, int r, int c){
            return 0<=r && r < grid.length 
                    && 0 <= c && c < grid[0].length;
        }
    }
    • 广度优先算法
      *

      java 复制代码
      class Solution {
          /**
          广度优先搜索bfs
          扫描整个二维网络,如果一个位置为1,加入队列,进行广度优先搜索
           */
          public int numIslands(char[][] grid) {
              if(grid == null || grid.length == 0){
                  return 0;
              }
      
              int nr = grid.length;
              int nc = grid[0].length;
              int nums_islands = 0;
      
              for(int r=0; r < nr; ++r){
                  for(int c = 0; c<nc; ++c){
                      if(grid[r][c] == '1'){
                          ++nums_islands;
                          grid[r][c] = '2';
                          Queue<Integer> neighbors = new LinkedList<>();
                          neighbors.add(r * nc + c);
                          while(!neighbors.isEmpty()){
                              int id = neighbors.remove();
                              int row = id / nc;
                              int col = id % nc;
                              if (row - 1 >= 0 && grid[row-1][col] == '1') {
                                  grid[row-1][col] = '2';
                                  neighbors.add((row-1) * nc + col);
                              }
                              if (row + 1 < nr && grid[row+1][col] == '1') {
                                  grid[row+1][col] = '2';
                                  neighbors.add((row+1) * nc + col);
                              }
                              if (col - 1 >= 0 && grid[row][col-1] == '1') {
                                  neighbors.add(row * nc + col-1);
                                  grid[row][col-1] = '2';
                              }
                              if (col + 1 < nc && grid[row][col+1] == '1') {
                                  neighbors.add(row * nc + col+1);
                                  grid[row][col+1] = '2';
                              }                      
                          }
                      }
                  }
              }
              return nums_islands;
          }

695. 岛屿的最大面积

  • 🔗:695. 岛屿的最大面积 - 力扣(LeetCode)

  • 思路:深度优先搜索

  • 代码:

    java 复制代码
    class Solution {
        public int maxAreaOfIsland(int[][] grid) {
            if(grid.length==0||grid[0].length==0){
                return 0;
            }
    
            int res = 0;
            for(int r=0; r<grid.length; r++){
                for(int c=0; c<grid[0].length; c++){
                    if(grid[r][c]==1){
                        int a = area(grid, r, c);
                        res = Math.max(res,a);
                    }
                }
            }
            return res;
        }
    
        int area(int[][] grid, int r, int c){
            if (!(0 <= r && r < grid.length 
                && 0 <= c && c < grid[0].length)) {
                return 0;
            }
            if(grid[r][c] != 1){
                return 0;
            }
    
            grid[r][c] = 2;
            return 1 
                + area(grid, r-1, c)
                + area(grid, r+1, c)
                + area(grid, r, c-1)
                + area(grid, r, c+1);
        }
    }
相关推荐
先吃饱再说1 小时前
为什么堆能 O(log n) 插入?拆解完全二叉树的数组魔法
算法·排序算法
留白_1 小时前
【决策树】泰坦尼克号生存预测
算法·决策树·机器学习
hqzing2 小时前
鸿蒙 PC 底层开发技术详解(七):二进制自签名算法的实现
算法·华为·harmonyos
AI科技星2 小时前
超复数全域经济周期场与信息谱场——金融与密码学底层理论重构《0·1·∞三元一体全域超复数统一场论》系列全集(六一字不漏完整合订终版)
人工智能·算法·金融·密码学·拓扑学·乖乖数学·全域数学
山峰哥2 小时前
数据库工程:Explain执行计划对比实战指南‌
数据库·sql·oracle·深度优先·宽度优先
AI科技星2 小时前
《01无穷全域信息场论:算子G与宇宙本体高维完备公理大典》
人工智能·python·算法·金融·乖乖数学·全域数学
Tim_102 小时前
【C++】013、空类占多少字节?
算法
Ricky_Theseus2 小时前
并查集:连通性问题
算法
Tairitsu_H3 小时前
[LC优选算法#18] 前缀和 | 除⾃⾝以外数组的乘积 | 和为K的⼦数组 | 和可被K整除的⼦数组
算法·前缀和·哈希算法
凯瑟琳.奥古斯特3 小时前
力扣1008:前序重建BST
开发语言·c++·算法·leetcode·职场和发展