1
- def permute (nums : list [int ]) -> list [list [int ]]:
1
+ def permute_recursive (nums : list [int ]) -> list [list [int ]]:
2
2
"""
3
3
Return all permutations.
4
- >>> from itertools import permutations
5
- >>> numbers= [1,2,3]
6
- >>> all(list(nums) in permute(numbers) for nums in permutations(numbers))
7
- True
4
+
5
+ >>> permute_recursive([1, 2, 3])
6
+ [[3, 2, 1], [2, 3, 1], [1, 3, 2], [3, 1, 2], [2, 1, 3], [1, 2, 3]]
8
7
"""
9
- result = []
10
- if len (nums ) == 1 :
11
- return [nums . copy () ]
8
+ result : list [ list [ int ]] = []
9
+ if len (nums ) == 0 :
10
+ return [[] ]
12
11
for _ in range (len (nums )):
13
12
n = nums .pop (0 )
14
- permutations = permute (nums )
13
+ permutations = permute_recursive (nums )
15
14
for perm in permutations :
16
15
perm .append (n )
17
16
result .extend (permutations )
18
17
nums .append (n )
19
18
return result
20
19
21
20
22
- def permute2 (nums ) :
21
+ def permute_backtrack (nums : list [ int ]) -> list [ list [ int ]] :
23
22
"""
24
23
Return all permutations of the given list.
25
24
26
- >>> permute2 ([1, 2, 3])
25
+ >>> permute_backtrack ([1, 2, 3])
27
26
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 2, 1], [3, 1, 2]]
28
27
"""
29
28
30
- def backtrack (start ) :
29
+ def backtrack (start : int ) -> None :
31
30
if start == len (nums ) - 1 :
32
31
output .append (nums [:])
33
32
else :
@@ -36,15 +35,14 @@ def backtrack(start):
36
35
backtrack (start + 1 )
37
36
nums [start ], nums [i ] = nums [i ], nums [start ] # backtrack
38
37
39
- output = []
38
+ output : list [ list [ int ]] = []
40
39
backtrack (0 )
41
40
return output
42
41
43
42
44
43
if __name__ == "__main__" :
45
44
import doctest
46
45
47
- # use res to print the data in permute2 function
48
- res = permute2 ([1 , 2 , 3 ])
46
+ res = permute_backtrack ([1 , 2 , 3 ])
49
47
print (res )
50
48
doctest .testmod ()
0 commit comments