题目:给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
正常代码
var(
path []int
res [][]int
)
func combine(n int, k int) [][]int {
path, res = make([]int, 0, k), make([][]int, 0)
backTracking(n,k,1)
return res
}
func backTracking(n int,k int,startIndex int) {
if len(path) == k{
tmp := make([]int, k)
copy(tmp, path)
res = append(res, tmp)
return
}
for i:=startIndex;i<=n;i++{
path = append(path,i)
backTracking(n,k,i+1)
path = path[:len(path)-1]
}
}
在终止条件,存放结果时有一个问题,为什么要新定义一个tmp,再append到res中?
一开始是这么写的。
if len(path) == k {
res = append(res, path)
return
}
对于该样例的结果为:
编辑一下调试代码
if len(path) == k {
fmt.Printf("path=%#v,%p \n", path, &path)
res = append(res, path)
fmt.Println("res=", res)
return
}
发现append到res中的是path的地址,path地址上的值改变之后,输出res的值自然也改变并且相同
所以需要新定义一个变量tmp,copy path中的值,再append到res中。
if len(path) == k{
tmp := make([]int, k)
copy(tmp, path)
res = append(res, tmp)
return
}
并且每次为新定义tmp分配的内存地址不同。