代码随想录图论 第一天 | 797.所有可能的路径 200. 岛屿数量

代码随想录图论 第一天 | 797.所有可能的路径 200. 岛屿数量

一、797.所有可能的路径

题目链接:https://leetcode.cn/problems/all-paths-from-source-to-target/

思路:求从0到n-1的所有路径,终止条件是当前节点为n-1。本题图的结构是group[][],group[x]表示x节点所能到达的所有节点的集合,深度优先做本题会一路向下搜索,到头后回溯。

java 复制代码
class Solution {
    List<List<Integer>> arrayLists = new ArrayList<>();
    List<Integer> list = new ArrayList<>();
    public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
        list.add(0);
        dfs(graph, 0);
    
        return arrayLists;
    }

    void dfs(int[][] graph, int cur) {
        if (cur == graph.length-1) {
            arrayLists.add(new ArrayList<>(list));
            return;
        }
        for (int i = 0; i < graph[cur].length; i++) {
            list.add(graph[cur][i]);
            dfs(graph, graph[cur][i]);
            list.remove(list.size()-1);
        }
    }
}

200. 岛屿数量

题目链接:https://leetcode.cn/problems/number-of-islands/

深搜:当前节点为1时岛屿数加1,然后把当前节点设置为0,并从当前节点开始进行上下左右四个方向的深度搜索,只要没越界,不是0,那就是相连的就都设置为0,直到递归结束,然后外层遍历开始寻找下一个为1的岛屿。

java 复制代码
class Solution {
   public int numIslands(char[][] grid) {
        int num = 0;
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (grid[i][j] == '1') {
                    num++;
                    dfs(grid, i, j);
                }
            }
        }
        return num;
    }

    void dfs(char[][] grid, int x, int y) {
        if (x < 0 || x >= grid.length || y < 0 || y >= grid[0].length || grid[x][y] == '0'){
            return;
        }
        grid[x][y] = '0';
        // 按照上下左右四个方向深度优先遍历
        dfs(grid, x-1, y);
        dfs(grid, x+1, y);
        dfs(grid, x, y-1);
        dfs(grid, x, y+1);
    }
}

广搜:广度优先需要额外有一个标记数组和队列,如果当前节点未遍历过,且为1,进行广度优先搜索,入队,出队,每个出队节点只搜索4个位置,即当前节点是上下左右,只要没超范围而且是1就可以入队,入队后要进行标记,直到该次广搜结束,岛屿数量加1.

java 复制代码
class Solution {
   // 上下左右
    int[][] move = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    boolean[][] visited;
    public int numIslands(char[][] grid) {
        int num = 0;
        visited = new boolean[grid.length][grid[0].length];
        for (int i = 0; i < grid.length; i++) {
            for (int j = 0; j < grid[0].length; j++) {
                if (!visited[i][j] && grid[i][j] == '1') {
                    bfs(grid, i, j);
                    num++;
                }
            }
        }
        return num;
    }

    void bfs(char[][] grid, int x, int y) {
        Deque<int[]> queue = new LinkedList<>();
        queue.offer(new int[]{x, y});
        visited[x][y] = true;
        while (!queue.isEmpty()) {
            int[] cur = queue.poll();
            int m = cur[0], n = cur[1];
            for (int i = 0; i < move.length; i++) {
                int nextX = m + move[i][0];
                int nextY = n + move[i][1];
                if (nextX < 0 || nextX >= grid.length || nextY < 0 || nextY >= grid[0].length) continue;
                if (!visited[nextX][nextY] && grid[nextX][nextY] == '1'){
                    queue.offer(new int[]{nextX, nextY});
                    visited[nextX][nextY] = true;
                }
            }
        }
    }
}
相关推荐
EdmundXjs5 分钟前
大模型核心概念解读
人工智能·算法
zzqssliu6 分钟前
SpringBoot框架搭建跨境独立站|Taocarts代购系统订单模块深度开发
java·spring boot·后端
lookaroundd7 分钟前
llm-compressor 普通量化调用链分析
python·算法
dinl_vin20 分钟前
FastAPI 系列 ·(四):数据库集成——SQLAlchemy 2.0 异步 ORM 与 Alembic 迁移
java·数据库·fastapi
小羊在睡觉21 分钟前
力扣239. 滑动窗口最大值
数据结构·后端·算法·leetcode·go
编码者卢布22 分钟前
【Azure Service Bus】Azure Service Bus Java SDK 中 Token 刷新异常的排查思路
java·python·azure
兰令水25 分钟前
topcode【随机算法题】【2026.5.20打卡-java版本】
java·开发语言·算法
此生决int35 分钟前
算法从入门到精通——前缀和
c++·算法·蓝桥杯
AI瓦力36 分钟前
技术分享 | 彻底解决图片“躺平”问题:Java 后端强制校准图片方向
java
武子康39 分钟前
Java-219 RocketMQ Spring Boot 集成指南:生产者与消费者实战
java·spring boot·分布式·kafka·消息队列·rocketmq·java-rocketmq