首页 > 其他分享 >力扣 leetcode 797. 所有可能的路径

力扣 leetcode 797. 所有可能的路径

时间:2022-12-07 00:01:51浏览次数:49  
标签:797 node idx graph 路径 leetcode 力扣 vector 节点

问题描述

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

graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j] 存在一条有向边)。

提示:

  • n == graph.length
  • 2 <= n <= 15
  • 0 <= graph[i][j] < n
  • graph[i][j] != i(即不存在自环)
  • graph[i] 中的所有元素 互不相同
  • 保证输入为 有向无环图(DAG)

示例

示例 1:

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

示例 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]]

解题思路

本题要输出路径,因此优先选择 DFS 。这里找到一条路径很简单,关键是要把路径记录下来。最简单的做法是在搜索最短路径的过程中记录路径,借助 DFS 的特性,我们可以用一个数组保存当前路径的节点序号,当找到目标节点后,就将路径保存下来。

class Solution {
public:
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        stack<int> s;
        vector<int> path(graph.size()); // 记录当前路径
        int idx = 0;
        vector<vector<int>> res;
        const int n = graph.size() - 1;
        s.push(0);
        while(!s.empty()){ // DFS
            int node = s.top();
            s.pop();
            if(node == -1){ // 这里node为-1表示,这是栈中某个节点的子节点已经全部遍历完毕了
                idx--;
            }
            else if(node == n){ // 到达目标节点,将路径保存下来
                path[idx++] = node;
                vector<int> r(idx);
                for(int j = 0; j < idx; j++){
                    r[j] = path[j];
                }
                res.push_back(r);
                idx--;
            }
            else{ // 不是目标节点,继续遍历
                path[idx++] = node;
                s.push(-1); // 这里将-1 加入是为了分隔每个节点遍历的子节点
                for(int i = 0; i < graph[node].size(); i++){
                    s.push(graph[node][i]);
                }
            }
        }
        return res;  
    }
};

标签:797,node,idx,graph,路径,leetcode,力扣,vector,节点
From: https://www.cnblogs.com/greatestchen/p/16961857.html

相关文章

  • 看起来简单实际上却很牛的KMP算法:LeetCode572-另一棵树的子树
    题目描述给定两个非空二叉树s和t,检验s中是否包含和t具有相同结构和节点值的子树。s的一个子树包括s的一个节点和这个节点的所有子孙。s也可以看做它自身的一棵......
  • 力扣 leetcode 130. 被围绕的区域
    问题描述给你一个m*n的矩阵board,由若干字符'X'和'O',找到所有被'X'围绕的区域,并将这些区域里所有的'O'用'X'填充。提示:m==board.lengthn==board[i......
  • #yyds干货盘点# LeetCode程序员面试金典:移除重复节点
    题目:编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。示例1:输入:[1,2,3,3,2,1]输出:[1,2,3]示例2:输入:[1,1,1,1,2]输出:[1,2]代码实现:classSolu......
  • 「查找表」字符串中不同整数的数目(力扣第1805题)
    本题为12月6日力扣每日一题题目来源:力扣第1805题题目tag:查找表双指针题面题目描述给你一个字符串word,该字符串由数字和小写英文字母组成。请你用空格替换每个不......
  • 力扣刷题03
    344.反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组s的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)......
  • 力扣378(java&python)-有序矩阵中第 K 小的元素(中等)
    题目:给你一个 nxn 矩阵 matrix,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。请注意,它是排序后的第k小元素,而不是第k个不同的元素。你必须找到......
  • 【LeetCode】第43天 - 136. 只出现一次的数字 | 169. 多数元素
    文章目录​​136.只出现一次的数字​​​​题目描述​​​​解题思路​​​​代码实现​​​​169.多数元素​​​​题目描述​​​​解题思路​​​​代码实现​​136.......
  • 【LeetCode】第44天 - 100. 相同的树
    100.相同的树​​题目描述​​​​解题思路​​​​代码实现​​题目描述给你两棵二叉树的根节点p和q,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并......
  • 【LeetCode】第47天 - 944. 删列造序
    944.删列造序​​题目描述​​​​解题思路​​​​代码实现​​题目描述解题思路此题比较简单,详见代码注释。代码实现classSolution{publicintminDeletionSize(St......
  • 【LeetCode】第48天 - 1037. 有效的回旋镖
    1037.有效的回旋镖​​题目描述​​​​解题思路​​​​代码实现​​题目描述解题思路没想到遇到一道纯数学题。所谓的“有效的回旋镖”就是指所给的三个点不在同一条直线......