go - 使用 Golang 时对深度优先搜索结果感到困惑

标签 go depth-first-search

我试过leetcode上的'Combination Sum',用test case的时候结果是错误的:

[7,3,2] 18

我用同样逻辑的C++也通过了,但是用Golang的时候,我的结果是:

[[2,2,2,2,2,2,2,2,2],[2,2,2,2,2,7,3,3],[2,2,2,2,3,7],[2,2,2,3,3,3,3],[2,2,7,7],[2,3,3,3,7],[3,3,3,3,3,3]]

正确的应该是

[[2,2,2,2,2,2,2,2,2],[2,2,2,2,2,2,3,3],[2,2,2,2,3,7],[2,2,2,3,3,3,3],[2,2,7,7],[2,3,3,3,7],[3,3,3,3,3,3]]

代码如下:

import "sort"
func combinationSum(candidates []int, target int) [][]int {
    result := make([][]int, 0, 0)
    resultp := &result
    sort.Ints(candidates)
    helper(candidates, 0, target, make([]int, 0, 0), resultp, len(candidates))
    return *resultp
}

func helper(nums []int, index int, target int, list []int, resultp *[][]int, length int) {
    if target == 0 {
        *resultp = append(*resultp, list)
        return
    }
    for i := index; i < length; i++ {
        if i != index && nums[i] == nums[i - 1] {
            continue
        }
        if (nums[i] > target) {
            break
        }
        helper(nums, i, target - nums[i], append(list, nums[i]), resultp, length)
    }
}

谁能告诉我为什么结果不正确,我只是对我的回答中的 [2,2,2,2,2,7,3,3] 感到困惑,为什么 7 在 3 之前,因为数组已排序?或者任何人都可以告诉我我在代码中犯了什么错误

最佳答案

append 函数可能会也可能不会修改 slice 引用的底层数组。因此,您在使用追加时并没有创建一个全新的列表。我更改了 helper 以匹配您想要的行为。

for i := index; i < length; i++ {
    if i != index && nums[i] == nums[i - 1] {
        continue
    }
    if nums[i] > target {
        break
    }
    var newList []int
    newList = append(newList, list...)
    newList = append(newList, nums[i])
    helper(nums, i, target - nums[i], newList, resultp, length)
}

关于go - 使用 Golang 时对深度优先搜索结果感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47648631/

相关文章:

mongodb - Go 官方 mongo-driver 中如何实现结构体字段验证?

algorithm - 图论深度优先搜索

algorithm - 为什么深度优先搜索声称具有空间效率?

http - 获取 https ://<mydomain. com>/translate/2327496366232: x509: 证书由未知权威签署”

javascript - Go channel 与 JavaScript 生成器有何不同?

mongodb - Golang MongoDB增量整数值

c - 以深度优先顺序递归遍历一般树

go - 循环中的 Println 和闭包输出不同的值

c++ - 深度优先搜索构造函数错误

c++ - 如何遍历图形并沿途提取边缘权重?