題目地址:
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;
}
}
時間複雜度,空間複雜度。