在附加元素之前,我记录了每个元素。但是结果看起来好像覆盖了某些元素。

不知道什么时候覆盖。

package main

import "fmt"

func main() {
    graph := [][]int{
        []int{3, 1},
        []int{4, 6, 7, 2, 5},
        []int{4, 6, 3},
        []int{6, 4},
        []int{7, 6, 5},
        []int{6},
        []int{7},
        []int{},
    }

    fmt.Println(allPathsSourceTarget(graph))
}

func allPathsSourceTarget(graph [][]int) [][]int {
    n := len(graph) - 1
    result := make([][]int, 0, 200)

    var pathRecord func(target, path []int)
    pathRecord = func(target, path []int) {
        if (len(target) == 0) && (path[len(path)-1] == n) {
            fmt.Println("insert into", path) // should end with 7
            result = append(result, path)
        }

        for _, v := range target {
            pathRecord(graph[v], append(path, v))
        }
    }

    for _, v := range graph[0] {
        pathRecord(graph[v], []int{0, v})
    }

    return result
}

结果中的每个元素都应以7结尾。

最佳答案

您的问题是与此行:

pathRecord(graph[v], append(path, v))

Go是如此“智能”,因此他试图重用相同的分片分配的内存,而您实际上更改了已经添加到结果中的路径。 ):

试试这个代替:
newPath = make([]int, len(path))
copy(newPath, path)
pathRecord(graph[v], append(newPath, v))

关于go - 此代码何时覆盖slice元素?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53904692/

10-12 12:35
查看更多