news 2026/6/23 1:28:54

代码随想录 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/6/23 19:07:54

玩转SM16714PHT景观装饰驱动IC(1)

一、概述 1. 芯片简介 SM16714PHT是深圳市明微电子股份有限公司推出的一款单线传输四通道LED驱动控制专用芯片&#xff0c;采用单线归零码SID数据协议。 SM16714PHT可通过芯片内之的电流增益调节功能设置电流2.5mA~40mA&#xff0c;OUT R/G/B/W各32级电流增益&#xff08;即…

作者头像 李华
网站建设 2026/6/23 15:08:52

云服务器的核心优势

云服务器作为新一代计算服务模式&#xff0c;正逐步替代传统物理服务器成为企业数字化转型的基础设施核心。其通过虚拟化技术整合计算资源&#xff0c;结合网络分布式架构实现弹性扩展&#xff0c;为用户带来远超传统IT架构的综合价值。以下从技术架构、成本控制、业务支撑等维…

作者头像 李华
网站建设 2026/6/23 15:10:20

Qwen3-14B-AWQ:重新定义轻量化大模型效率标准

在2025年AI大模型领域&#xff0c;Qwen3-14B-AWQ以其革命性的14.8亿参数设计和AWQ 4-bit量化技术&#xff0c;正在重塑企业级AI部署的性价比认知。这款来自阿里巴巴通义千问团队的开源模型&#xff0c;不仅将硬件门槛降低至消费级GPU水平&#xff0c;更在性能保持率上实现了97%…

作者头像 李华
网站建设 2026/6/22 23:10:12

Linux环境下的C语言编程(三十九)

三、队列的基本操作&#xff08;接三十八&#xff09;1. 基本数据结构定义#include <stdio.h> #include <stdlib.h> #include <stdbool.h>#define MAX_SIZE 100 // 队列最大容量// 队列结构体定义 typedef struct {int data[MAX_SIZE]; // 存储数据的数组i…

作者头像 李华
网站建设 2026/6/22 20:26:16

毕业设计实战:基于SSM+MySQL的图书商城管理系统设计与实现,从需求到测试全流程拆解,新手也能轻松通关!

毕业设计实战&#xff1a;基于SSMMySQL的图书商城管理系统设计与实现&#xff0c;从需求到测试全流程拆解&#xff0c;新手也能轻松通关&#xff01; 谁懂啊&#xff01;当初做图书商城管理系统毕设时&#xff0c;光“图书表”和“图书收藏表”的外键关联就卡了2天——一开始没…

作者头像 李华