【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)

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