首页 > 其他分享 >剑指offer110:所有路径

剑指offer110:所有路径

时间:2022-12-13 11:38:20浏览次数:46  
标签:所有 offer110 graph 路径 List result path 节点


题目:

给定一个有 n 个节点的有向无环图,用二维数组 graph 表示,请找到所有从 0 到 n-1 的路径并输出(不要求按顺序)。

graph 的第 i 个数组中的单元都表示有向图中 i 号节点所能到达的下一些结点(译者注:有向图是有方向的,即规定了 a→b 你就不能从 b→a ),若为空,就是没有下一个节点了。

示例一:

剑指offer110:所有路径_java


输入:graph = [[1,2],[3],[3],[]]

输出:[[0,1,3],[0,2,3]]

解释:有两条路径 0 -> 1 -> 3 和 0 -> 2 -> 3示例二:

剑指offer110:所有路径_图_02


输入: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]]

分析:
题目要求列出从节点0到节点n-1的所有n-1的所有路径,因此深度优先搜索是更合适的选择。
深度优先搜索通常用递归实现,从节点0出发开始搜索,每当搜索到节点i时,先将该节点添加到路径中去,如果该节点正好是节点n-1,那么就找到一条从节点0到节点n-1的路径,如果不是,则从graph[i]找出每个相邻的节点并用同样的方法进行搜索。当从节点i出发能够抵达的所有节点都搜索完毕之后,将回到前一个节点搜索其他与之相邻的节点。在回到前一个节点之前,需要将节点i从路径中删除,这个过程可以用下面的递归代码。
该代码中path记录当前路径中的所有节点,result记录所有已经找到的路径,上诉代码中没有判断一个节点是否已经访问过,在图搜索时通常需要判断一个节点是否已经访问过,这样可以避免反复访问环中的节点,由于该题已经明确图是一个有向无环图,因此没有必要担心重复访问环中的节点
代码:

package com.kuang;

import java.util.LinkedList;
import java.util.List;

public class AllPathsSourceTarget {
public static void main(String[] args) {
AllPathsSourceTarget allPathsSourceTarget = new AllPathsSourceTarget();
int[][] graph = {{1,2},{3},{3},{}};
List<List<Integer>> lists = allPathsSourceTarget.allPathsSourceTarget(graph);
System.out.println(lists);
}
public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
List<List<Integer>> result = new LinkedList<>();
List<Integer> path = new LinkedList<>();
dfs(0,graph,path,result);
return result;
}

private void dfs(int source, int[][] graph, List<Integer> path, List<List<Integer>> result) {
path.add(source);
// 如果该节点正好是节点n-1,那么就找到一条从节点0到节点n-1的路径
if (source == graph.length-1){
// 将路径添加到结果集中
result.add(new LinkedList<Integer>(path));
}else {
for (int next:graph[source]){
dfs(next,graph,path,result);
}
}
//在回到前一个节点之前,需要将节点i从路径中删除
path.remove(path.size()-1);
}
}

剑指offer110:所有路径_List_03


标签:所有,offer110,graph,路径,List,result,path,节点
From: https://blog.51cto.com/u_15911055/5933473

相关文章