1 回答

TA貢獻1816條經(jīng)驗 獲得超6個贊
正如我在注釋中所寫的那樣,原始代碼中的問題是函數(shù)中的追加用法。用于傳遞電流擴展的電流到方法。我已向此函數(shù)添加了更多日志記錄combinationSum2appendacccandidatecombinationSum2
func combinationSum2(candidates []int, output *[][]int, target int, acc []int, sum int) {
if sum == target {
fmt.Println("Acc:", acc)
*output = append(*output, acc)
fmt.Println("Output:", output)
return
}
if sum > target {
return
}
for i := 0; i < len(candidates); i++ {
extendedAcc := append(acc, candidates[i])
fmt.Printf("Extended: %v %p\n", extendedAcc, extendedAcc)
combinationSum2(candidates[i:], output, target, extendedAcc, sum+candidates[i])
}
}
并收到以下結(jié)果(這只是前幾行有趣的幾行)
Extended: [2] 0x14000130008
Extended: [2 2] 0x14000130030
Extended: [2 2 2] 0x1400013c020
Extended: [2 2 2 2] 0x1400013c020
Acc: [2 2 2 2]
Output: &[[2 2 2 2]]
Extended: [2 2 2 3] 0x1400013c020
Extended: [2 2 2 5] 0x1400013c020
Extended: [2 2 3] 0x1400013c040
Extended: [2 2 3 3] 0x1400013c040
如您所見,變量在被添加到后仍然具有相同的地址(它們在值之后打印為十六進制)。此地址的最終值是您在 中看到的值。它不是的原因是附加如何在內(nèi)部工作的結(jié)果。如果當(dāng)前數(shù)組中沒有足夠的空間,它會創(chuàng)建一個新的數(shù)組并向其返回一個切片。當(dāng)您比較 slice 的地址時,此行為是可見的。extendedAccOutput[2 2 2 5]Output[2 2 3 3]extended
這是正常工作的解決方案:
package main
import "fmt"
type node struct {
value int
children []*node
}
func combinationSum(candidates []int, target int) [][]int {
var output [][]int
var acc []int
combinationSum2(candidates, &output, target, acc, 0)
return output
}
func combinationSum2(candidates []int, output *[][]int, target int, acc []int, sum int) {
if sum == target {
fmt.Println(acc)
*output = append(*output, acc)
fmt.Println(output)
return
}
if sum > target {
return
}
for i := 0; i < len(candidates); i++ {
currentAcc := make([]int, 0, len(acc) + 1)
currentAcc = append(currentAcc, acc...)
currentAcc = append(currentAcc, candidates[i])
combinationSum2(candidates[i:], output, target, currentAcc, sum+candidates[i])
}
}
func main() {
combinationSum([]int{2, 3, 5}, 8)
}
或者,該函數(shù)可能如下所示:combinationSum2
func combinationSum2(candidates []int, output *[][]int, target int, acc []int, sum int) {
if sum == target {
fmt.Println(acc)
accCopy := make([]int, 0, len(acc))
accCopy = append(accCopy, acc...)
*output = append(*output, accCopy)
fmt.Println(output)
return
}
if sum > target {
return
}
for i := 0; i < len(candidates); i++ {
combinationSum2(candidates[i:], output, target, append(acc, candidates[i]), sum+candidates[i])
}
}
在我看來,這通常不太安全,但可以很好地解決這個問題。
- 1 回答
- 0 關(guān)注
- 65 瀏覽
添加回答
舉報