LeetCode第797题: 所有可能的路径

目录

1.问题描述

2.问题分析


1.问题描述

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

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

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

  • n == graph.length

  • 2 <= n <= 15

  • 0 <= graph[i][j] < n

  • graph[i][j] != i(即不存在自环)

  • graph[i] 中的所有元素互不相同

  • 保证输入为有向无环图(DAG)

2.问题分析

        思路分析:有向无环图(Directed acyclic graph, DAG)是图论中的一个概念,它指的是一个无回路的有向图。问题是要找到0节点到n − 1节点的所有路径,对于所有路径的问题,我们可以用深度优先搜索来做(广度优先搜索也可以)。

        这题让在有向无环图中输出从顶点0到顶点n-1的所有路径,可以使用dfs,从顶点0开始搜索,搜索所有路径,因为是无环的,所以搜索的时候不会出现死循环。到顶点n-1的时候就把这条路径上所有的点都保存下来。因为是dfs搜索,往下走的时候选择节点,往回走的时候要记得撤销选择。

JAVA

public List<List<Integer>> allPathsSourceTarget(int[][] graph) {List<List<Integer>> ans = new ArrayList<>();ArrayList<Integer> path = new ArrayList<>();path.add(0);// 把起始节点0加进来dfs(graph, 0, ans, path);return ans;
}private void dfs(int[][] graph, int index, List<List<Integer>> ans, List<Integer> path) {//  到最后一个节点的时候,说明找了一个一条有效路径if (index == graph.length - 1) {ans.add(new ArrayList<>(path));return;}// 当前节点指向哪些节点(可以看做是n叉树的子节点,然后遍历他的子节点)int[] directs = graph[index];for (int i = 0; i < directs.length; i++) {path.add(directs[i]);// 把当前节点加入到路径中dfs(graph, directs[i], ans, path);// 递归path.remove(path.size() - 1); // 撤销选择}
}

C++

public:vector<vector<int>> allPathsSourceTarget(vector<vector<int>> &graph) {vector<vector<int>> ans;vector<int> path;path.push_back(0);// 把起始节点0加进来dfs(graph, 0, ans, path);return ans;}void dfs(vector<vector<int>> &graph, int index, vector<vector<int>> &ans, vector<int> &path) {//  到最后一个节点的时候,说明找了一个一条有效路径if (index == graph.size() - 1) {ans.emplace_back(path);return;}// 当前节点指向哪些节点(可以看做是n叉树的子节点,然后遍历他的子节点)for (int g: graph[index]) {path.emplace_back(g);// 把当前节点加入到路径中dfs(graph, g, ans, path);// 递归path.pop_back(); // 撤销选择}}

C

void dfs(int **graph, int graphSize, int *graphColSize, int *returnSize,int **returnColumnSizes, int **ans, int *path, int v, int count) {//  到最后一个节点的时候,说明找了一个一条有效路径if (v == graphSize - 1) {ans[*returnSize] = malloc(count * sizeof(int));memcpy(ans[*returnSize], path, count * sizeof(int));(*returnColumnSizes)[(*returnSize)++] = count;return;}// 当前节点指向哪些节点(可以看做是n叉树的子节点,然后遍历他的子节点)for (int i = 0; i < graphColSize[v]; ++i) {path[count++] = graph[v][i];// 把当前节点加入到路径中dfs(graph, graphSize, graphColSize, returnSize, returnColumnSizes, ans, path, graph[v][i], count);// 递归count--;// 撤销选择}
}int **allPathsSourceTarget(int **graph, int graphSize, int *graphColSize, int *returnSize, int **returnColumnSizes) {int **ans = malloc(20000 * sizeof(int *));int *path = malloc(15 * sizeof(int));int v = 0;int count = 0;*returnSize = 0;*returnColumnSizes = malloc(20000 * sizeof(int));path[count++] = v;// 把起始节点0加进来dfs(graph, graphSize, graphColSize, returnSize, returnColumnSizes, ans, path, v, count);return ans;
}

Python

def allPathsSourceTarget(self, graph: List[List[int]]) -> List[List[int]]:def dfs(index):# 到最后一个节点的时候,说明找了一个一条有效路径if index == len(graph) - 1:ans.append(path[:])return# 当前节点指向哪些节点(可以看做是n叉树的子节点,然后遍历他的子节点)for direct in graph[index]:path.append(direct)  # 把当前节点加入到路径中dfs(direct)  # 递归path.pop()  # 撤销选择ans = []path = [0]dfs(0)return ans

复杂度分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/630364.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R语言计算:t分布及t检验

t分布理论基础 t分布也称Student’s t-distribution&#xff0c;主要出现在小样本统计推断中&#xff0c;特别是当样本量较小且总体标准差未知时&#xff0c;用于估计正态分布的均值。其定义基于正态分布和 X 2 X^{2} X2分布&#xff08;卡方分布&#xff09;。如果随机变量X服…

2024经常用且免费的10个网盘对比,看看哪个比较好用!

网盘在我们的工作和学习中经常会用到&#xff0c;也是存储资料的必备工具&#xff0c;有了它&#xff0c;我们就不用走到哪都带着移动硬盘了&#xff0c;而目前市场上的主流网盘还有数十款&#xff0c;其中有免费的也有付费的&#xff0c;各家不一&#xff0c;今天小编就来为您…

时间同步服务项目练习

一.配置server主机要求如下&#xff1a; 1.server主机的主机名称为 ntp_server.example.com 2.server主机的IP为&#xff1a; 172.25.254.100 3.server主机的时间为1984-11-11 11&#xff1a;11&#xff1a;11 4.配置server主机的时间同步服务要求可以被所有人使用 更改主机名…

生成式AI入门必读:基本概念、数据挑战与解决方案

随着生成式 AI&#xff08;通常简称为 GenAI&#xff09;的兴起&#xff0c;我们的世界发生了翻天覆地的变化。而随着 AI 生成内容的革命性应用程序的出现&#xff0c;人们也认为生成式 AI 将从根本上影响社会的各个行业和部门。 组织们都在竞相捕捉生成式 AI 的潜力。如果您也…

allure2教程-3-测试报告定制

领取资料&#xff0c;咨询答疑&#xff0c;请➕wei: June__Go 上一小节&#xff0c;我们学习一下pytestallure2生成html测试报告的方法&#xff0c;本小节我们学习一下allure2测试报告的定制。 allure2报告预览 预览网址&#xff1a;https://demo.qameta.io/allure/# allur…

Simba:Mamba 增强了 U-ShiftGCN,用于视频中的骨骼动作识别

Simba&#xff1a;Mamba 增强了 U-ShiftGCN&#xff0c;用于视频中的骨骼动作识别 摘要IntroductionRelated WorksMethodologyDown-sampling ShiftGCN Encoder Experiments & ResultsDatasets Simba: Mamba augmented U-ShiftGCN for Skeletal Action Recognition in Video…

Python教学入门:数字类型与字符串

字符串元素组成的序列 字符串元素组成的序列指的是字符串中的每个字符按照一定的顺序排列形成的序列。在 Python 中&#xff0c;字符串是由字符组成的有序序列&#xff08;Sequence&#xff09;&#xff0c;每个字符在字符串中有其固定的位置&#xff08;索引&#xff09;&…

k8s 控制器StatefulSet原理解析

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Kubernetes航线图&#xff1a;从船长到K8s掌舵者》 &#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、k8s概述 2、有状态服务和无状态服务…

详细分析Python的继承和多态(附Demo)

目录 前言1. 继承2. 多态 前言 入行多年&#xff0c;对于知识点还会混淆&#xff0c;此处主要做一个详细区分 继承&#xff08;Inheritance&#xff09;: 面向对象编程中的一个重要概念&#xff0c;允许一个类&#xff08;称为子类或派生类&#xff09;继承另一个类&#xff…

关于 AssertionError: Torch not compiled with CUDA enabled 问题

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

Vnode是如何产生的?

源码 流程图 源码解读 Vue.js2.0中有两种生成方式&#xff1a;第一种是直接在Vue对象的option中添加render字段&#xff1b;第二种是像Vue.js 1.x版本那样写一个模板或者指定一个el根元素&#xff0c;它会首先转换成模板&#xff0c;经过HTMI语法解析器生成一个 ast 抽象语法树…

备战面试K8S

备战面试&&K8S Kubernetes关于DockerDocker的优缺点分析 WebAssemblyWebAssembly与Container比较 CtrCrictlCtr和CriCtl的区别 Pod生命周期PodConditions容器状态Pod容器组成生命周期的流程 Kubelet EFK日志采集工具的优缺点 Kubernetes 容器运行接口 Container Runti…