1、Slice容量不够时,再append就变成新生成的一个slice了
参见填golang slice的append的“坑” - 知乎 (zhihu.com)
2、append时结果不变
在leetcode的46题,我的代码如下
func permute(nums []int) [][]int {
if len(nums) == 0{
return [][]int{}
}
result := [][]int{}
track := []int{}
used := make([]bool, len(nums))
backtrack(nums, &track, &used, &result)
return result
}
func backtrack(nums []int, track *[]int, used *[]bool, result *[][]int){
// 触发结束条件
if len(*track) == len(nums){
temp := make([]int, len(*track))
copy(temp, *track) // 一定要copy到temp中再append,不能直接把*track append到*result中
*result = append(*result, temp)
return
}
for idx, num := range nums{
// 排除不合法的选择
if (*used)[idx]{
continue // nums[idx]已经做过选择
}
// 做选择
*track = append(*track, num)
(*used)[idx] = true
// 进入下一层决策树
backtrack(nums, track, used, result)
// 撤销选择
*track = (*track)[:len(*track)-1]
(*used)[idx] = false
}
return
}
在这段代码中
我的本意是将*track append到*result中,但是直接append结果不对,result不变,然而copy一遍后再append到*result的话就对了,所以显然不是第一条slice的容量的坑,目前还没发现原因,夜已深,后面找到原因了再填坑