@@ -3,21 +3,18 @@ function permute(nums: number[]): number[][] {
3
3
return [ [ ...nums ] ] ;
4
4
}
5
5
6
- const allPerms : number [ ] [ ] = [ ] ;
6
+ const permutations : number [ ] [ ] = [ ] ;
7
7
8
- for ( let _ of nums ) {
9
- const num = nums . pop ( ) ! ;
10
- const perms = permute ( nums ) ;
8
+ for ( let i = 0 ; i < nums . length ; i ++ ) {
9
+ const num = nums . shift ( ) ;
11
10
12
- for ( let perm of perms ) {
13
- perm . push ( num ) ;
14
- allPerms . push ( perm ) ;
11
+ for ( let perm of permute ( nums ) ) {
12
+ permutations . push ( [ num , ...perm ] ) ;
15
13
}
16
-
17
- nums . unshift ( num ) ;
14
+ nums . push ( num ) ;
18
15
}
19
16
20
- return allPerms ;
17
+ return permutations ;
21
18
}
22
19
23
20
function permute2 ( nums : number [ ] , collected : number [ ] = [ ] ) : number [ ] [ ] {
@@ -38,3 +35,27 @@ function permute2(nums: number[], collected: number[] = []): number[][] {
38
35
39
36
return allPerms ;
40
37
}
38
+
39
+ function permute3 ( nums : number [ ] ) : number [ ] [ ] {
40
+ const permutations : number [ ] [ ] = [ ] ;
41
+
42
+ function backtrace ( candidates : number [ ] , permutation : number [ ] ) {
43
+ if ( candidates . length === 0 ) {
44
+ permutations . push ( permutation . slice ( ) ) ;
45
+ return ;
46
+ }
47
+
48
+ for ( let i = 0 ; i < nums . length ; i ++ ) {
49
+ const num = nums . shift ( ) ;
50
+ backtrace ( [ ...nums ] , [ ...permutation , num ] ) ;
51
+ nums . push ( num ) ;
52
+ }
53
+ }
54
+
55
+ backtrace ( nums , [ ] ) ;
56
+
57
+ return permutations ;
58
+ }
59
+
60
+ console . log ( permute ( [ 1 , 2 , 3 ] ) ) ;
61
+ console . log ( permute3 ( [ 1 , 2 , 3 ] ) ) ;
0 commit comments