1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
| func permute(nums []int) [][]int {
if len(nums) == 1 {
return [][]int{nums}
}
l := len(nums)
var (
res [][]int // 返回结果
tmp = make([]int, 0, l) // 中间值
tk = make(map[int]bool, l) // 记录已经使用的数字
)
return trackBack()
}
func trackBack(nums, tmp []int, ret [][]int, tk map[int]bool) [][]int {
// 递归出口
if len(nums) == len(tmp) {
c := make([]int, len(tmp))
copy(c, tmp)
// 4. ret[[3,6,9]]
ret = append(ret, c)
return ret
}
// [3, 6, 9]
for _, v := range nums {
// 回溯检查
if tk[v] {
continue
}
// 1. 做标记 tmp[3] map[3]=true
// 2. 做标记 tmp[3,6] map[6]=true
// 3. 做标记 tmp[3,6,9] map[9]=true
tmp = append(tmp, v)
tk[v] = true
ret = trackBack(nums, tmp, ret, tk)
// 清除
tk[v] = false
tmp = tmp[:len(tmp)-1]
}
return ret
}
|