【Leetcode】797. All Paths From Source to Target

題目地址:

https://leetcode.com/problems/all-paths-from-source-to-target/

給定一個有向圖,頂點編號爲0N10\sim N-1,以鄰接表形式給出。要求返回所有從00N1N-1的簡單路徑(即路徑上的點沒有重複)。

思路是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;
    }
}

時間複雜度O(V+E)O(V+E),空間複雜度O(V)O(V)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章