797. 所有可能的路径(Leetcode刷题 dfs深度优先搜索)

797. 所有可能的路径(Leetcode刷题 dfs深度优先搜索)

文章目录

  • 797. 所有可能的路径(Leetcode刷题 dfs深度优先搜索)
    • 题目
    • 解题代码
    • 代码效率

题目

给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)

二维数组的第 i 个数组中的单元都表示有向图中 i 号节点所能到达的下一些节点,空就是没有下一个结点了。

译者注:有向图是有方向的,即规定了 a→b 你就不能从 b→a 。

示例 1:

797. 所有可能的路径(Leetcode刷题 dfs深度优先搜索)_第1张图片

输入:graph = [[1,2],[3],[3],[]] 输出:[[0,1,3],[0,2,3]] 解释:有两条路径 0 -> 1 ->
3 和 0 -> 2 -> 3

示例 2:

797. 所有可能的路径(Leetcode刷题 dfs深度优先搜索)_第2张图片

输入:graph = [[4,3,1],[3,2,4],[3],[4],[]]
输出:[[0,4],[0,3,4],[0,1,3,4],[0,1,2,3,4],[0,1,4]]

示例 3:

输入:graph = [[1],[]] 输出:[[0,1]]

示例 4:

输入:graph = [[1,2,3],[2],[3],[]] 输出:[[0,1,2,3],[0,2,3],[0,3]]

示例 5:

输入:graph = [[1,3],[2],[3],[]] 输出:[[0,1,2,3],[0,3]]

解题代码

class Solution {
public:
    vector<int> stk;
    vector<vector<int>>res;
    void  dfs(vector<vector<int>>&graph,int begin,int end){
        if(begin==end){     		//首先判断的是递归的终止条件
            res.push_back(stk);     //此时将这个栈中的元素入二维数组
            return ;
        }
        for(auto& m:graph[begin]){ //递归过程
            stk.push_back(m);      //结点入栈
            dfs(graph,m,end);      //从该结点开始,继续深度遍历
            stk.pop_back();        //执行到该步骤,说明dfs已经返回,此时,通过pop使得回到上一分叉点
        }
    }
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        stk.push_back(0);               //先入栈初始结点,这个是不变的
        dfs(graph,0,graph.size()-1);    //dfs的目标是从0开始,遍历到size()-1的位置
        return res;                     //递归结束之后,返回二维数组
    }
};

代码效率

执行用时:20 ms, 在所有 C++ 提交中击败了36.72%的用户
内存消耗:11.8 MB, 在所有 C++提交中击败了42.04%的用户

你可能感兴趣的:(Leetcode刷题笔记,leetcode,dfs)