注意:
1 golang中函数是一等公民,写回溯的写法比c++简单
2 回溯返回的地方,需要tmp重新生成一份,不重新生成的话会在后面的操作修改这个值。(和扩容有关)
func permute(nums []int) [][]int {
ans := make([][]int, 0)
visit := make(map[int]int)
length := len(nums)
tmp := make([]int, 0)
var trackBack func(tmp []int)
trackBack = func(tmp []int) {
if len(tmp) == length {
ans = append(ans, append([]int(nil), tmp...)) // 注意2
return
}
for _, v := range nums {
if _, ok := visit[v]; ok {
continue
}
tmp = append(tmp, v)
visit[v] = 1
trackBack(tmp)
tmp = tmp[0 : len(tmp)-1]
delete(visit, v)
}
}
trackBack(tmp)
return ans
}