Skip to content

Commit 716fb77

Browse files
aQuaaQua
aQua
authored and
aQua
committed
finish Problem 46
1 parent 4465986 commit 716fb77

File tree

2 files changed

+45
-13
lines changed

2 files changed

+45
-13
lines changed

Algorithms/0046.permutations/README.md

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,22 @@
11
# [46. Permutations](https://leetcode.com/problems/permutations/)
22

33
## 题目
4+
Given a collection of distinct numbers, return all possible permutations.
45

6+
For example,
7+
`[1,2,3]` have the following permutations:
8+
```
9+
[
10+
[1,2,3],
11+
[1,3,2],
12+
[2,1,3],
13+
[2,3,1],
14+
[3,1,2],
15+
[3,2,1]
16+
]
17+
```
518

619
## 解题思路
7-
20+
按照手写排列的思路,编写递归程序即可。
821

922
## 总结
10-
11-
Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,44 @@
11
package Problem0046
22

33
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)
59

6-
makePermute(nums, []int{}, &ans)
10+
var ans [][]int
11+
12+
makePermutation(0, n, nums, vector, taken, &ans)
713

814
return ans
915
}
1016

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
1427
}
1528

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)
2037

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+
}
2243
}
2344
}

0 commit comments

Comments
 (0)