问题内容
(编码问题是生成所有组合的解决方案,这些组合的总和达到目标,候选arr中每个元素的次数不受限制。)
二维 [][]int
切片 theList
在附加 []int
(tmpCombo
) 的递归中通过引用传递,但附加后,其中一个元素被修改,[3 3 3 3 3 3]
更改为 [3 3 3 3 3 2]
。所以我必须在执行 append()
之前复制 tmpCombo
。 append(arr, ele)
是否更改了原始 arr
切片?如果是这样,我应该观察到更多原始的 arr
被修改,但这种情况只发生一次。所以我实际上很困惑这个切片 append()
是如何工作的。
https://go.dev/play/p/PH10SxiF7A5
...
theList: [.... [3 3 3 3 3 3]]
theList: [.... [3 3 3 3 3 2] [3 3 3 3 2 2 2]]
登录后复制
(我还尝试执行 for 循环并继续附加到切片,原始切片根本没有改变...)
package main
import (
"fmt"
"sort"
)
func combinationSum(candidates []int, target int) [][]int {
sort.Sort(sort.Reverse(sort.IntSlice(candidates)))
var theList [][]int
var tmpCombo []int
rCombo(candidates, target, 0, tmpCombo, &theList)
return theList
}
func rCombo(candidates []int, target int, index int, tmpCombo []int, theList *[][]int) {
if index >= len(candidates) {
fmt.Println("index:", index)
return
}
// fmt.Println(target)
if candidates[index] > target {
rCombo(candidates, target, index+1, tmpCombo, theList)
return
}
for i:=index; i登录后复制
正确答案
由于这个答案说明了同一问题,我现在明白了https://www.php.cn/link/0d924f0e6b3fd0d91074c22727a53966一个>.
基本上,如果切片将数据存储在具有指定容量的一个位置,但将长度作为单独的属性...在我的情况下,执行多个 append(tmpCombo, target)
实际上会修改 tmpCombo
中的数据,因为该变量是' t 重新分配/更新新的长度,并且同一位置的基础数据被修改(未重新分配时)。
tldr。确保使用以下任一方式传递相同数据的新副本:
make()
新建切片并copy()
结束(make()
分配具体容量)
或
append(nil []int, arr...]
. (append()
可能会分配更多内存,但适合频繁修改)
以上就是append() 可能会修改原始切片(2d 切片递归)的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!