797. 所有可能的路径

该篇文章详细描述了一种使用深度优先遍历算法的方法,解决LeetCode上的一个问题,即查找从给定起点到终点的所有可能路径。作者通过递归实现DFS,并展示了如何记录和回溯路径以找到所有满足条件的路径。
摘要由CSDN通过智能技术生成

原题链接:

797. 所有可能的路径

https://leetcode.cn/problems/all-paths-from-source-to-target/description/

完成情况:

在这里插入图片描述

解题思路:

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

    // 定义深度优先搜索函数
    public void dfs(int[][] graph, int node) {
        // 如果当前节点是 n - 1,即目标节点,保存这条路径
        if (node == graph.length - 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);    // 将起点加入节点值列表
        dfs(graph, 0);    // 从起点开始深度优先搜索
        return ans;    // 返回所有从起点到终点的路径
    }
}

这段代码实现了一个深度优先遍历算法,用于查找从起点到终点的所有路径。在深度优先搜索过程中,通过递归遍历每个节点的相邻节点,并记录路径中经过的节点。当到达终点时,将当前路径保存下来。在搜索过程中,通过回溯来处理路径的添加和删除,确保正确记录和更新路径信息。

参考代码:

package 代码随想录.图论;

import java.util.ArrayList;
import java.util.List;

public class _797所有可能的路径 {
    List<List<Integer>> res;    //存储答案
    List<Integer> tempList;     //存储中间过程的节点
    /**
     *
     * @param graph
     * @return
     */
    public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
        // graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)
        res = new ArrayList<List<Integer>>();
        tempList = new ArrayList<Integer>();
        tempList.add(0);    //从头开始遍历整个图
        dfs_allPathsSourceTarget(graph,0);      //数字用来表示节点序号
        return res;
    }

    /**
     *
     * @param graph
     * @param curNode
     */
    private void dfs_allPathsSourceTarget(int[][] graph, int curNode) {
        if (curNode == graph.length -1){    //当前节点已经走到结尾
            res.add(new ArrayList<>(tempList));
            return;
        }
        //正常去寻找可以匹配的节点数组中的所有元素
        for (int i = 0;i<graph[curNode].length;i++){
            int nextNode = graph[curNode][i];
            tempList.add(nextNode);
            dfs_allPathsSourceTarget(graph,nextNode);   //顺着nextNode看看能不能找到可以与之接连下去的节点
            tempList.remove(tempList.size() - 1);   //回溯
        }
    }
}

错误经验吸取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值