1
+ /*
2
+
3
+ Date: Dec 25, 2014
4
+ Problem: Permutations
5
+ Difficulty: Easy
6
+ Source: https://oj.leetcode.com/problems/permutations/
7
+ Notes:
8
+ Given a collection of numbers, return all possible permutations.
9
+ For example,
10
+ [1,2,3] have the following permutations:
11
+ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1].
12
+
13
+ Solution: dfs...
14
+ */
15
+ public class Solution {
16
+ public List < List < Integer >> permute_1 (int [] num ) {
17
+ List < List < Integer >> res = new ArrayList < List < Integer >>( );
18
+ List < Integer > path = new ArrayList < Integer > ( );
19
+ boolean [] free = new boolean [num .length ];
20
+ Arrays .fill (free , true);
21
+ permuteRe (num , res , path ,free );
22
+ return res ;
23
+ }
24
+ void permuteRe (int [] num , List < List < Integer >> res , List < Integer > path , boolean [] free ) {
25
+ if (path .size () == num .length ) {
26
+ ArrayList < Integer > tmp = new ArrayList < Integer > (path );
27
+ res .add (tmp );
28
+ return ;
29
+ }
30
+ for (int i = 0 ; i < num .length ; ++ i ) {
31
+ if (free [i ] == true) {
32
+ free [i ] = false;
33
+ path .add (num [i ]);
34
+ permuteRe (num , res , path , free );
35
+ path .remove (path .size () - 1 );
36
+ free [i ] = true;
37
+ }
38
+ }
39
+ }
40
+ public boolean nextPermutation (int [] num ) {
41
+ int last = num .length - 1 ;
42
+ int i = last ;
43
+ while (i > 0 && num [i - 1 ] >= num [i ]) -- i ;
44
+ for (int l = i , r = last ; l < r ; ++ l , -- r ) {
45
+ num [l ] = num [l ] ^ num [r ];
46
+ num [r ] = num [l ] ^ num [r ];
47
+ num [l ] = num [l ] ^ num [r ];
48
+ }
49
+ if (i == 0 ) {
50
+ return false;
51
+ }
52
+ int j = i ;
53
+ while (j <= last && num [i - 1 ] >= num [j ]) ++ j ;
54
+ num [i - 1 ] = num [i - 1 ] ^ num [j ];
55
+ num [j ] = num [i - 1 ] ^ num [j ];
56
+ num [i - 1 ] = num [i - 1 ] ^ num [j ];
57
+ return true;
58
+ }
59
+ public List < List < Integer >> permute_2 (int [] num ) {
60
+ List < List < Integer >> res = new ArrayList < List < Integer >>( );
61
+ Arrays .sort (num );
62
+ do {
63
+ List < Integer > path = new ArrayList < Integer > ( );
64
+ for (int i : num ) path .add (i );
65
+ res .add (path );
66
+ } while (nextPermutation (num ));
67
+ return res ;
68
+ }
69
+ }
0 commit comments