在 Go 中回溯以查找有向无环图中的所有路径,将路径分配给解决方案切片的问题(Leetcode 797)
Posted
技术标签:
【中文标题】在 Go 中回溯以查找有向无环图中的所有路径,将路径分配给解决方案切片的问题(Leetcode 797)【英文标题】:Backtracking in Go to find all paths in Directed Acyclic Graph, problem assigning paths to a solution slice (Leetcode 797) 【发布时间】:2021-02-13 18:43:54 【问题描述】:我在 Go 中尝试 Leetcode 747。问题总结:
给定一个有 n 个节点的有向无环图 (DAG),标记为 0 到 n - 1、找到从节点0到节点n-1的所有可能路径,并返回 以任何顺序。
给出的图如下:graph[i] 是你能找到的所有节点的列表 从节点 i 访问(即存在从节点 i 到节点的有向边 图[i][j])。
这是我目前的解决方案:
func allPathsSourceTarget(graph [][]int) [][]int
allSolutions := [][]int
target := len(graph) - 1
isSolution := func(current int) bool
return current == target
processSolution := func(solution []int)
allSolutions = append(allSolutions, solution)
var backtrack func(currentPath []int)
backtrack = func(a []int)
currentNode := a[len(a)-1]
if isSolution(currentNode)
processSolution(a)
else
candidates := graph[currentNode]
for _, c := range candidates
a = append(a, c)
backtrack(a)
a = a[:len(a)-1]
backtrack([]int0)
return allSolutions
它通过了 7/30 个输入,但随后在这个 [[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]]
。
我认为问题在于我如何将每个结果附加到 allSolutions
切片。如果我记录每次出现的解决方案,这就是预期的结果,但它似乎会改变已经添加的解决方案。
如果我将日志添加到allSolutions
func,对于上述输入,这是输出:
Solution:
[0 4]
New allSolutions:
[[0 4]]
Solution:
[0 3 4]
New allSolutions:
[[0 3] [0 3 4]]
Solution:
[0 1 3 4]
New allSolutions:
[[0 1] [0 3 4] [0 1 3 4]]
Solution:
[0 1 2 3 4]
New allSolutions:
[[0 1] [0 3 4] [0 1 2 3] [0 1 2 3 4]]
Solution:
[0 1 4]
New allSolutions:
[[0 1] [0 3 4] [0 1 4 3] [0 1 2 3 4] [0 1 4]]
我很想知道为什么会这样。是否与从更高范围修改变量有关?
【问题讨论】:
【参考方案1】:processSolution
应该复制它的参数。否则,backtrack
会继续改变它传入的切片,从而导致您看到的损坏。
【讨论】:
太好了,谢谢!我使用了copy 函数,解决了我的问题。以上是关于在 Go 中回溯以查找有向无环图中的所有路径,将路径分配给解决方案切片的问题(Leetcode 797)的主要内容,如果未能解决你的问题,请参考以下文章