所有可能的路径_回溯法_java

所有可能的路径

leetcode链接

问题描述

给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)

graphi 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graphij存在一条有向边)。

示例

示例 1:

输入:graph = \[1,2,3,3,\[\]]

输出:\[0,1,3,0,2,3]

解释:有两条路径 0 -> 1 -> 3 和 0 -> 2 -> 3

示例 2:

输入:graph = \[4,3,1,3,2,4,3,4,\[\]]

输出:\[0,4,0,3,4,0,1,3,4,0,1,2,3,4,0,1,4]

解题思路

采用深度优先进行路径搜索并用回溯法实现。

代码实现

java 复制代码
class Solution {
   //存放搜索过程中走过的节点
   List<Integer> path = new ArrayList<>();
   //存放所有可能路径
   List<List<Integer>> res = new ArrayList<>();

   public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
       //处理0节点,将0节点放入走过的路径中
       path.add(0);

       //深度搜索0节点
       dfs(0, graph);

       return res;
   }

   //注意:此处graph也要传入用于判断节点之间是否有路径
   void dfs (int node, int[][] graph) {
       if (node == graph.length - 1) {
           //若已走到终点将可能路径传入结果集
           //注意:此处一定要用path新建一个对象后再存入res!
           res.add(new ArrayList<>(path));
           return;
       }

       for (int i = 0; i < graph[node].length; i++) {
           //处理graph[node][i]节点,将graph[node][i]节点放入走过的路径中
           path.add(graph[node][i]);

           //深度搜索该节点
           dfs(graph[node][i], graph);

           //回溯,将该节点移出可能路径,而后尝试对下一个节点的处理。
           path.remove(path.size() - 1);

       }

       return;
   }
}

注意事项

为什么一定要用path新建一个对象后再存入res?

因为如果直接将path存入res,则存入res的是path的引用。当所有的可能路径都搜索且回溯完毕后path = 0, 最后拿到的res将形如\[0,0, 0]。

复杂度

空间复杂度:O(n)

时间复杂度:O(n * 2^n)

th = 0, 最后拿到的res将形如\[0,0, 0]。

复杂度

空间复杂度:O(n)

时间复杂度:O(n * 2^n)

我们可以找到一种最坏情况,即每一个点都可以去往编号比它大的点。此时路径数为 O(2^n),且每条路径长度约为 O(n),因此总时间复杂度为 O(n * 2^n)。

相关推荐
罗湖老棍子8 小时前
Biorhythms(信息学奥赛一本通- P1639)
算法·数论·裴蜀定理·扩展欧几里得·扩展中国剩余定理
panxianren12 小时前
Bun 1.4 的 bun test --parallel 将 4 秒的测试套件缩短到约 1 秒
java·javascript
sunshine22 girl13 小时前
Java学习七 Java 项目实战2-注册业务
java·学习
奋发向前wcx14 小时前
CSP-J复赛模拟赛4 王晨旭补题 2026.10.5
算法
省钱兄--zs14 小时前
北京24小时自助健身房系统软件开发实战:从架构设计到部署指南
java·数据仓库·spring boot·小程序·需求分析
youdexiang14 小时前
Android录音软件时间关键词检索功能分析
java·人工智能
sunshine22 girl15 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习
code2cat15 小时前
Java进阶篇之AtomicStampedReference:引用回到原值,版本戳仍能记住变化
java·cas·并发编程·aba
念何架构之路16 小时前
zap采样器与性能优化内幕
算法·性能优化·哈希算法
泡茶喝茶写代码17 小时前
A股量化数据工程:从 REST 接口到策略信号(第 8 篇):成长能力因子:营收与利润增速
java·python·股票数据api·股票数据api接口·股票量化数据api·股票量化数据接口·股票数据api数据