|
1 | 1 | package Problem0046
|
2 | 2 |
|
3 | 3 | func permute(nums []int) [][]int {
|
4 |
| - ans := [][]int{} |
| 4 | + n := len(nums) |
| 5 | + // vector 是一组可能的解答 |
| 6 | + vector := make([]int, n) |
| 7 | + // taken[i] == true 表示 nums[i] 已经出现在了 vector 中 |
| 8 | + taken := make([]bool, n) |
5 | 9 |
|
6 |
| - makePermute(nums, []int{}, &ans) |
| 10 | + var ans [][]int |
| 11 | + |
| 12 | + makePermutation(0, n, nums, vector, taken, &ans) |
7 | 13 |
|
8 | 14 | return ans
|
9 | 15 | }
|
10 | 16 |
|
11 |
| -func makePermute(nums, res []int, ans *[][]int) { |
12 |
| - if len(nums) == 0 { |
13 |
| - *ans = append(*ans, res) |
| 17 | +// 这个方式和我原来的方式相比, |
| 18 | +// 增加了比较的次数 |
| 19 | +// 但是,减少了切片生成的次数。 |
| 20 | +// 所以,速度会快一些。 |
| 21 | +func makePermutation(cur, n int, nums, vector []int, taken []bool, ans *[][]int) { |
| 22 | + if cur == n { |
| 23 | + tmp := make([]int, n) |
| 24 | + copy(tmp, vector) |
| 25 | + *ans = append(*ans, tmp) |
| 26 | + return |
14 | 27 | }
|
15 | 28 |
|
16 |
| - for i, n := range nums { |
17 |
| - temp := make([]int, 0, len(nums)) |
18 |
| - temp = append(temp, nums[:i]...) |
19 |
| - temp = append(temp, nums[i+1:]...) |
| 29 | + for i := 0; i < n; i++ { |
| 30 | + if !taken[i] { |
| 31 | + // 准备使用 nums[i],所以,taken[i] == true |
| 32 | + taken[i] = true |
| 33 | + // NOTICE: 是 vector[cur] |
| 34 | + vector[cur] = nums[i] |
| 35 | + |
| 36 | + makePermutation(cur+1, n, nums, vector, taken, ans) |
20 | 37 |
|
21 |
| - makePermute(temp, append(res[:len(res):len(res)], n), ans) |
| 38 | + // 下一个循环中 |
| 39 | + // vector[cur] = nums[i+1] |
| 40 | + // 所以,在这个循环中,恢复 nums[i] 自由 |
| 41 | + taken[i] = false |
| 42 | + } |
22 | 43 | }
|
23 | 44 | }
|
0 commit comments