题目地址:
https://leetcode.com/problems/all-paths-from-source-to-target/
给定一个有向图,顶点编号为,以邻接表形式给出。要求返回所有从到的简单路径(即路径上的点没有重复)。
思路是DFS。只需注意递归回溯的时候要恢复现场。代码如下:
import java.util.ArrayList;
import java.util.List;
public class Solution {
public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
List<List<Integer>> res = new ArrayList<>();
boolean[] visited = new boolean[graph.length];
dfs(0, graph.length - 1, graph, new ArrayList<>(), res, visited);
return res;
}
// 从cur出发,path代表走到cur时路径上的所有节点
private void dfs(int cur, int dest, int[][] graph, List<Integer> path, List<List<Integer>> res, boolean[] visited) {
// 标记当前顶点为已访问,并把当前顶点加入path
visited[cur] = true;
path.add(cur);
// 如果发现了已经到达了终点,则将路径加入最终结果,然后直接返回;
// 返回之前要恢复现场
if (cur == dest) {
res.add(new ArrayList<>(path));
path.remove(path.size() - 1);
visited[cur] = false;
return;
}
for (int next : graph[cur]) {
if (!visited[next]) {
dfs(next, dest, graph, path, res, visited);
}
}
// 返回之前要恢复现场
path.remove(path.size() - 1);
visited[cur] = false;
}
}
时间复杂度,空间复杂度。