〇 slice 扩容规则
〇 slice append 修改值
在解答 LeetCode 78. Subsets 时,我的原答案是
func subsets(nums []int) [][]int {res := make([][]int, 0)track := make([]int, 0)backtrack(track, nums, &res, 0)return res}// track 路径// nums 选择列表// 结束条件:start == len(nums)func backtrack(track, nums []int, res *[][]int, start int) {*res = append(*res, track)for i := start; i < len(nums); i++ {track = append(track, nums[i])backtrack(track, nums, res, i+1)track = track[:len(track)-1]}}
但得出的结果却是 [[] [3] [1 3] [1 2 3] [1 3] [3] [2 3] [3]]
可见某个切片的原数组的值被改动了,经过分析可知是 track 切片
由于程序运行的具体情况很复杂,在此不做分析
如果想要将一个切片的数据追加到另一个切片中,建议使用 copy 和中间变量,而非 append
package mainimport "fmt"func main() {s1 := [][]int{{1}, {2}, {3}}s2 := []int{4}s1 = append(s1, s2)fmt.Println(s1) // [[1] [2] [3] [4]]s2[0] *= 10fmt.Println(s1) // [[1] [2] [3] [40]]}
package mainimport "fmt"func main() {s1 := [][]int{{1}, {2}, {3}}s2 := []int{4}temp := make([]int, len(s2))copy(temp, s2)s1 = append(s1, temp)fmt.Println(s1) // [[1] [2] [3] [4]]s2[0] *= 10fmt.Println(s1) // [[1] [2] [3] [4]]}
将原答案改为
func subsets(nums []int) [][]int {res := make([][]int, 0)track := make([]int, 0)backtrack(track, nums, &res, 0)return res}// track 路径// nums 选择列表// 结束条件:start == len(nums)func backtrack(track, nums []int, res *[][]int, start int) {temp := make([]int, len(track))copy(temp, track)*res = append(*res, temp)for i := start; i < len(nums); i++ {track = append(track, nums[i])backtrack(track, nums, res, i+1)track = track[:len(track)-1]}}
通过题目

