1. 项目背景与核心价值
在算法学习过程中,图论相关的路径查找问题一直是面试和竞赛中的高频考点。这道LeetCode 98题"所有可达路径"要求找出从源节点到目标节点的所有可能路径,它不仅考察基础的DFS/BFS应用能力,更是理解回溯算法和邻接表操作的经典案例。
我在刷题过程中发现,很多初学者容易陷入两个误区:要么过度依赖暴力枚举导致超时,要么遗漏了环状路径的处理。实际上,这类问题有着非常清晰的解题框架,只要掌握几个关键技巧就能轻松应对90%的变种题目。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法核心思路解析
2.1 问题重述与建模
给定一个有向无环图(DAG)的邻接表表示,要求编写函数返回从节点0到节点n-1的所有可能路径。例如:
输入:graph = [[1,2],[3],[3],[]]
输出:[[0,1,3],[0,2,3]]
这实际上考察的是图的遍历能力。我们需要特别注意:
- 题目明确说明无环,避免了环路检测的复杂度
- 路径需要完整记录而非仅计数
- 所有路径都需要穷举
2.2 算法选型对比
对于路径查找问题,通常有DFS和BFS两种方案:
| 方法 | 空间复杂度 | 实现难度 | 适用场景 |
|---|---|---|---|
| DFS | O(n) | 简单 | 路径记录 |
| BFS | O(n^2) | 中等 | 最短路径 |
由于本题需要完整路径而非最短路径,DFS的回溯特性天然适合路径记录。下面是DFS的模板伪代码:
python复制def dfs(node, path):
if node == target:
result.append(path)
return
for neighbor in graph[node]:
dfs(neighbor, path + [neighbor])
2.3 关键优化点
虽然基础DFS能解决问题,但实际实现时有三个优化重点:
- 路径传递方式:直接拼接列表会创建新对象,更优方案是使用可变对象+回溯
- 终止条件处理:提前判断是否到达终点,避免多余递归
- *邻接表预处理
