news 2026/4/16 10:57:27

代码随想录 797.所有可能的路径

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
代码随想录 797.所有可能的路径

思路:深度优先搜索的基础题目。

1.确认递归函数和参数:

(1)首先需要存一个用来遍历的图。

(2)存一个当前遍历的节点,定义为x。

(3)需要存一个n表示终点。在遍历的时候,当x == n时,表明找到了终点。

(4)单一路径和路径集合可以放在全局变量。

vector<vector<int>> result; // 收集符合条件的路径 vector<int> path; // 0节点到终点的路径 // x:目前遍历的节点 // graph:存当前的图 // n:终点 void dfs (const vector<vector<int>>& graph, int x, int n) {

2.确认终止条件:当当前遍历的节点为节点n的时候,就找到了一条从出发点到终止点的路径。

// 当前遍历的节点x 到达节点n if (x == n) { // 找到符合条件的一条路径 result.push_back(path); return; }

3.处理当前搜索节点出发的路径:接下来是走当前遍历节点x的下一个节点。

(1)首先要找到x节点指向了哪些节点,遍历方式如下:

for (int i = 1; i <= n; i++) { // 遍历节点x链接的所有节点 if (graph[x][i] == 1) { // 找到 x指向的节点,就是节点i } }

(2)接下来就是将选中的x所指向的节点,加入到单一路径来。

path.push_back(i); // 遍历到的节点加入到路径中来

(3)进入下一层递归。

dfs(graph, i, n); // 进入下一层递归

(4)最后就是回溯的过程,撤销本次添加节点的操作。

(5)该过程的整体代码如下所示:

for (int i = 1; i <= n; i++) { // 遍历节点x链接的所有节点 if (graph[x][i] == 1) { // 找到 x链接的节点 path.push_back(i); // 遍历到的节点加入到路径中来 dfs(graph, i, n); // 进入下一层递归 path.pop_back(); // 回溯,撤销本节点 } }

附代码:

(一)邻接表写法:

class Solution { public List<List<Integer>> allPathsSourceTarget(int[][] graph) { // 从0到1暴力搜索即可 List<List<Integer>> res = new ArrayList<>(); List<Integer> path = new ArrayList<>(); path.add(0); //将起始节点0加入路径 dfs(res,path,graph,0,graph.length); return res; } private void dfs(List<List<Integer>> res,List<Integer> path,int[][] graph,int x,int n){ //找到一条符合条件的路径 if(x == n - 1){ res.add(new ArrayList<>(path)); return; } for(int i : graph[x]){ //寻找x指向的节点 path.add(i); //遍历到的节点加入到路径上来 dfs(res,path,graph,i,n); //进入下一层递归 path.remove(path.size() - 1); //回溯,撤销本节点 //path.removeLast(); } } }

(二)邻接矩阵写法:

class Solution { public List<List<Integer>> allPathsSourceTarget(int[][] graph) { List<List<Integer>> res = new ArrayList<>(); List<Integer> path = new ArrayList<>(); // 初始化邻接矩阵 int n = graph.length; boolean[][] adjMatrix = new boolean[n][n]; //因为Leetcode给的是邻接表格式,所以需要手动将邻接表转换为邻接矩阵 //根据输入构建邻接矩阵 for (int i = 0; i < n; i++) { for (int neighbor : graph[i]) { adjMatrix[i][neighbor] = true; } } // 将起始节点0加入路径 path.add(0); dfs(res, path, adjMatrix, 0, n); return res; } private void dfs(List<List<Integer>> res, List<Integer> path, boolean[][] adjMatrix, int x, int n) { //找到一条符合条件的路径 if (x == n - 1) { res.add(new ArrayList<>(path)); return; } // 遍历所有可能的邻居节点 for (int i = 0; i < n; i++) { if (adjMatrix[x][i]) { // 如果存在从x到i的边 path.add(i); //遍历到的节点i加入到路径上来 dfs(res, path, adjMatrix, i, n); //进入下一层递归 path.remove(path.size() - 1); //回溯,撤销本节点 } } } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/8 18:36:49

YOLOv5模型压缩终极指南:剪枝、量化、蒸馏三合一实战

YOLOv5模型压缩终极指南&#xff1a;剪枝、量化、蒸馏三合一实战 【免费下载链接】yolov5 yolov5 - Ultralytics YOLOv8的前身&#xff0c;是一个用于目标检测、图像分割和图像分类任务的先进模型。 项目地址: https://gitcode.com/GitHub_Trending/yo/yolov5 你是否正在…

作者头像 李华
网站建设 2026/4/10 17:15:07

Phar反序列化-NSSCTF-prize_z1

一、环境描述1、打开环境&#xff0c;是一段PHP代码。<META http-equiv"Content-Type" content"text/html; charsetutf-8" /> <?php highlight_file(__FILE__); class getflag {function __destruct() {echo getenv("FLAG");} }class …

作者头像 李华
网站建设 2026/4/8 20:12:11

运放新手全流程教学:从添加工艺库到后仿真的实战指南

运放新手教程&#xff0c;全流程教学&#xff0c;从添加工艺库到原理图&#xff0c;前仿真&#xff0c;版图步骤&#xff0c;后仿真 GPDK45nm&#xff0c;二级弥勒补偿运放 文档141页电路版图testbench 第一步&#xff0c;教初始环境怎么配置&#xff0c;怎么添加工艺库 第二步…

作者头像 李华
网站建设 2026/4/13 20:25:21

08章 向量内存操作 - “Vega“ 7nm Instruction Set ArchitectureReference Guide

向量内存&#xff08;VMEM&#xff09;指令将每个工作项的数据分别读取或写入VGPR中。这与标量内存指令形成对比&#xff0c;标量内存指令移动的是波前中所有线程共享的单个数据块。所有向量内存&#xff08;VM&#xff09;操作都由纹理缓存系统&#xff08;一级和二级缓存&…

作者头像 李华
网站建设 2026/4/15 3:52:57

数据洪流时代的存储革命:从磁带到云原生的进化之路

数据洪流时代的存储革命&#xff1a;从磁带到云原生的进化之路在数字化浪潮席卷全球的今天&#xff0c;存储数据已从简单的信息保存升华为驱动社会运转的核心基础设施。从企业核心业务系统到个人手机相册&#xff0c;从科学研究的海量实验数据到人工智能训练的庞大数据集&#…

作者头像 李华