力扣第797题 所有可能的路径 C++ 深度优先搜索 +java

news2024/12/25 13:16:58

题目

797. 所有可能的路径

中等

相关标签

深度优先搜索   广度优先搜索   图   回溯

给你一个有 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)

思路和解题方法

  1. vector<vector<int>> result;vector<int> path;:这两个成员变量分别用来收集符合条件的路径和存储当前节点0到终点的路径。

  2. void dfs (vector<vector<int>>& graph, int x):这是一个递归函数,用于进行深度优先搜索。参数graph表示当前的图,x表示目前遍历的节点。

  3. dfs函数中,首先判断当前节点是否为终点,如果是则将当前路径path加入到结果集合result中;否则遍历当前节点连接的所有节点,将其加入路径中,然后递归调用dfs函数进行下一层遍历,最后需要撤销当前节点,即回溯操作。

  4. vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph):这是一个公开的接口函数,用于开始整个遍历过程。在这个函数中,首先将起始节点0加入到路径中,然后调用dfs函数开始深度优先搜索,最终返回结果集合result

复杂度

        时间复杂度:

                O(2^m)

        间复杂度取决于图的结构和节点之间的连接关系。假设有n个节点,m条边,那么在最坏情况下,时间复杂度为O(2^m),因为在DFS过程中,我们会探索所有可能的路径。

        空间复杂度

                O(2^m)

        空间复杂度方面,主要消耗的是存储结果集合result和当前路径path所需的空间。在最坏情况下,可能会有指数级的路径数量,因此空间复杂度也是指数级别的,即O(2^m)。

c++ 代码

class Solution {
public:
    vector<vector<int>> result; // 用于存储符合条件的路径集合
    vector<int> path; // 用于存储当前经过的路径节点

    // 深度优先搜索函数
    // x:当前遍历的节点
    // graph:当前的图
    void dfs (vector<vector<int>>& graph, int x) {
        // 寻找从节点 0 到节点 n-1 的路径,即graph.size() - 1
        if (x == graph.size() - 1) { // 找到一条符合条件的路径
            result.push_back(path); // 将当前路径加入结果集合
            return;
        }
        for (int i = 0; i < graph[x].size(); i++) { // 遍历节点x连接的所有节点
            path.push_back(graph[x][i]); // 将遍历到的节点加入路径中
            dfs(graph, graph[x][i]); // 递归进入下一层搜索
            path.pop_back(); // 回溯,撤销当前节点
        }
    }

    // 寻找从节点0到终点的所有路径
    vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
        path.push_back(0); // 起始节点为0
        dfs(graph, 0); // 开始深度优先搜索
        return result; // 返回结果集合
    }
};

Java代码

// 深度优先遍历
class Solution {
List<List<Integer>> ans;		// 用来存放满足条件的路径
List<Integer> cnt;		// 用来保存 dfs 过程中的节点值

public void dfs(int[][] graph, int node) {
    if (node == graph.length - 1) {		// 如果当前节点是 n - 1,那么就保存这条路径
        ans.add(new ArrayList<>(cnt));
        return;
    }
    for (int index = 0; index < graph[node].length; index++) {
        int nextNode = graph[node][index];
        cnt.add(nextNode); // 将下一个节点加入路径中
        dfs(graph, nextNode); // 递归深度优先搜索下一个节点
        cnt.remove(cnt.size() - 1);		// 回溯,撤销当前节点,尝试其他分支
    }
}

public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
    ans = new ArrayList<>(); // 初始化结果集合
    cnt = new ArrayList<>(); // 初始化当前路径
    cnt.add(0);			// 注意,0 号节点要加入 cnt 数组中作为起点
    dfs(graph, 0); // 开始深度优先搜索
    return ans; // 返回结果
}
}

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

郑州市管城区工信局局长任华民一行莅临中创算力调研指导工作

2023年11月15日&#xff0c;为深入了解企业生产经营情况&#xff0c;解决发展诉求。郑州市管城区工信局局长任华民等领导一行莅临中创算力&#xff0c;中创副总经理杨光、技术总监刘朝阳、行政主管生田等人员陪同调研。 调研期间&#xff0c;双方就生产经营、“算力数据中心”…

零基础学Python怎么学习?我来告诉你

对于IT新手来说&#xff0c;零基础学Python的话&#xff0c;之后可选择的职业方向非常多。Python全栈和爬虫一直以来都是市场的最火的就业岗位之一&#xff0c;它们的薪资回报也算是开发岗里面的顶级了。而且随着大数据和人工智能时代的到来&#xff0c;数据处理和人工智能行业…

Python | 机器学习之逻辑回归

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《人工智能奇遇记》&#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 目录结构 1. 机器学习之逻辑回归概念 1.1 机器学习 1.2 逻辑回归 2. 逻辑回归 2.1 实验目的…

通过注释来埋点

目录 开始 插件编写 功能一 功能二 功能三 合并功能 运行代码 总结 这篇文章主要讲如何根据注释&#xff0c;通过babel插件自动地&#xff0c;给相应函数插入埋点代码&#xff0c;在实现埋点逻辑和业务逻辑分离的基础上&#xff0c;配置更加灵活 这篇文章想要达到的效…

idea查看UML类图

idea查看UML类图 一、如何查看UML类图 1.1 选择需要查看的类或者包&#xff0c;鼠标右键&#xff0c;选择Diagrams->Show Diagram 1.2 对于UML类图中的包&#xff0c;选中后点击鼠标右键-> Expand Nodes(展开节点) 展开前 展开后 1.3 展开后分布比较凌乱&#xff…

inner join left join 什么情况效果相同

效果不同的情况 SELECT g.name AS groupName, g.root_code AS rootCode, g.data_sort AS groupDataSort, l.* FROM wise_system_point_group g LEFT JOIN wise_system_point_list l ON g.code l.group_code WHERE g.code "drug" ORDER BY g.data_sort, l.data_s…

DBA_IND_STATISTICS 字段含义

功能 展示数据库中所有索引的优化器统计信息。 字段说明 参考&#xff1a;https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000885743

骨传导式蓝牙耳机值得入手吗?盘点最值得入手的5款骨传导耳机

在骨传导耳机还没有火之前&#xff0c;相信很多朋友都是使用入耳式和头戴式耳机比较多一点&#xff0c;但是慢慢的会发现&#xff0c;这两种耳机都存在很大的问题&#xff0c;比如说入耳式耳机&#xff0c;长时间佩戴会造成耳朵痛等问题&#xff0c;而头戴式耳机因为隔音效果好…

一文解释对比学习

对比学习是一种无监督学习技术&#xff0c;其核心思想是通过比较不同样本之间的相似性和差异性来学习数据的表示&#xff08;features&#xff09;。它不依赖于标签数据&#xff0c;而是通过样本之间的相互关系&#xff0c;使得模型能够学习到有意义的特征表示。 在对比学习中…

金融行业备份容灾:如何满足严格行业标准同时实现成本效益优化?

北京时间11月9日&#xff0c;中国工商银行股份有限公司在美全资子公司——工银金融服务有限责任公司&#xff08;ICBCFS&#xff09;遭受勒索软件攻击&#xff0c;导致部分业务系统中断&#xff0c;造成部分市场的重大损失。中国工商银行的这次网络攻击事件也再次凸显了金融系统…

[Mac软件]Adobe XD(Experience Design) v57.1.12.2一个功能强大的原型设计软件

Adobe XD是一个直观、强大的UI/UX开发工具&#xff0c;旨在设计、原型设计、用户之间共享材料&#xff0c;以及通过数字技术设计交互。Adobe XD为您提供开发网站、应用程序、语音界面、游戏界面、电子邮件模板等所需的一切。 无限制地创建 设计各种互动&#xff0c;创建看起来…

一起学docker系列之三docker的详细安装步骤

目录 前言1. 准备环境2. 卸载已有的Docker3. 安装编译工具4. 安装必需的软件5. 配置镜像仓库6. 更新YUM软件包索引7. 安装Docker CE8. 启动Docker9. 测试Docker10. 卸载Docker结语 前言 安装Docker是一项重要的任务&#xff0c;因为它为应用程序提供了容器化的环境&#xff0c…

SAP 比较两个内表记录的差异及取元素域值

一、比较两个内表记录的差异&#xff0c;可以使用FM&#xff1a;CTVB_COMPARE_TABLES来比较两个内表间的差异&#xff0c;有那些纪录是新增的&#xff0c;那些是修改过的和那些是被删除的。 CALL FUNCTION CTVB_COMPARE_TABLESEXPORTINGtable_old old_tab[]table_new new_t…

【寒武纪(9)】MLU架构

⼀个MLU 设备由 Memory ⼦系统、MTP&#xff08;Multi Tensor Processor&#xff09;⼦系统、Media ⼦系统等构成。MTP⼦系统是寒武纪MLU 架构的核⼼。 文章目录 TP1 架构TP2 架构TP3 1⾯向不同 MLU 架构的 Cambricon BANG 编程最佳实践1.1 Device 级异构调优指南1.2 Cluster …

【VSCode】Visual Studio Code 下载与安装教程

前言 Visual Studio Code&#xff08;简称 VS Code&#xff09;是一个轻量级的代码编辑器&#xff0c;适用于多种编程语言和开发环境。本文将介绍如何下载和安装 Visual Studio Code。 下载安装包 首先&#xff0c;我们需要从官方网站下载 Visual Studio Code 的安装包。请访…

d3dx9_39.dll丢失怎么修复?d3dx9_39.dll丢失的四种修复办法分享

d3dx9_39.dll是DirectX库中的一个重要组件&#xff0c;属于Microsoft Direct3D 9 API。它提供了许多用于创建和渲染3D图形的函数。DirectX是一套开发多媒体应用程序的API&#xff0c;广泛应用于游戏、视频和图形处理等领域。d3dx9_39.dll文件主要负责处理3D图形渲染、动画、光源…

[C/C++]数据结构 链表OJ题:随机链表的复制

题目描述: 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新…

Python武器库开发-flask篇之URL重定向(二十三)

flask篇之URL重定向(二十三) 通过url_for()函数构造动态的URL&#xff1a; 我们在flask之中不仅仅是可以匹配静态的URL&#xff0c;还可以通过url_for()这个函数构造动态的URL from flask import Flask from flask import url_forapp Flask(__name__)app.route(/) def inde…

B031-网络编程 Socket Http TomCat

目录 计算机网络网络编程相关术语IP地址ip的概念InerAdress的了解与测试 端口URLTCP、UDP和7层架构TCPUDPTCP与UDP的区别和联系TCP的3次握手七层架构 Socket编程服务端代码客户端代码 http协议概念Http报文 Tomcat模拟 计算机网络 见文档 网络编程相关术语 见文档 IP地址 …

Python--快速入门四

Python--快速入门四 1.Python函数 1.在括号中放入函数的参数。 2.可以通过return在函数作用域外获取函数作用域内的值。(默认的return值为None) 代码展示&#xff1a;BMI计算函数 def calculate_BMI(fuc_height,fuc_weight):fuc_BMI fuc_weight/(fuc_height**2)return fuc…