@@ -35,6 +35,43 @@ var swap = function(nums, i, j) {
3535} ;
3636
3737
38+ var deepCopyArray = function ( nums ) {
39+ var newNums = [ ] ;
40+ for ( var i = 0 ; i < nums . length ; i ++ ) {
41+ newNums [ i ] = nums [ i ] ;
42+ }
43+ return newNums ;
44+ } ;
45+
46+ // A iterative version, accepted, 140ms, beats 100%
47+ // same idea as permutation,
48+ // but, sort first, then if there is number is same as the previous one, skip
49+ // for example: nums=[1,2,2]
50+ // step1: [1]
51+ // step2: inserst 2 to [1], two possibilities: [2,1], [1,2]
52+ // step3: inserst 2 to [1,2] and [2,1]? but there is a 2 in each array, so skip this number and return
53+ var permuteUnique = function ( nums ) {
54+ if ( nums . length === 0 ) return nums ;
55+ nums . sort ( function ( a , b ) {
56+ return a - b ;
57+ } ) ;
58+ var results = [ [ nums [ 0 ] ] ] ;
59+ for ( var i = 1 ; i < nums . length ; i ++ ) {
60+ var newResults = [ ] ;
61+ for ( var m = 0 ; m < results . length ; m ++ ) {
62+ for ( var j = 0 ; j <= i ; j ++ ) {
63+ var list = deepCopyArray ( results [ m ] ) ;
64+ list . splice ( j , 0 , nums [ i ] ) ;
65+ newResults . push ( list ) ;
66+ if ( results [ m ] [ j ] === nums [ i ] ) break ;
67+ }
68+ }
69+ results = newResults ;
70+ }
71+
72+ return results ;
73+ } ;
74+
3875var deepCopyArray = function ( nums ) {
3976var newNums = [ ] ;
4077for ( var i = 0 ; i < nums . length ; i ++ ) {