@@ -62,22 +62,14 @@ Similar problems:
6262``` python
6363class Solution :
6464 def permute (self , nums : List[int ]) -> List[List[int ]]:
65- return list (permutations(nums))
66- ```
67-
68- #### Python3
69-
70- ``` python
71- class Solution :
72- def permute (self , nums : List[int ]) -> List[List[int ]]:
73- def dfs (i ):
74- if i == n:
65+ def dfs (i : int ):
66+ if i >= n:
7567 ans.append(t[:])
7668 return
77- for j in range (n ):
69+ for j, x in enumerate (nums ):
7870 if not vis[j]:
7971 vis[j] = True
80- t[i] = nums[j]
72+ t[i] = x
8173 dfs(i + 1 )
8274 vis[j] = False
8375
@@ -133,7 +125,7 @@ public:
133125 vector<vector<int >> ans;
134126 vector<int > t(n);
135127 vector<bool > vis(n);
136- function<void(int)> dfs = [ &] (int i) {
128+ auto dfs = [ &] (this auto&& dfs, int i) -> void {
137129 if (i == n) {
138130 ans.emplace_back(t);
139131 return;
@@ -166,10 +158,10 @@ func permute(nums []int) (ans [][]int) {
166158 ans = append(ans, slices.Clone(t))
167159 return
168160 }
169- for j, v := range nums {
161+ for j, x := range nums {
170162 if !vis[j] {
171163 vis[j] = true
172- t[i] = v
164+ t[i] = x
173165 dfs(i + 1)
174166 vis[j] = false
175167 }
@@ -185,43 +177,60 @@ func permute(nums []int) (ans [][]int) {
185177``` ts
186178function permute(nums : number []): number [][] {
187179 const n = nums .length ;
188- const res: number [][] = [];
180+ const ans: number [][] = [];
181+ const vis: boolean [] = Array (n ).fill (false );
182+ const t: number [] = Array (n ).fill (0 );
189183 const dfs = (i : number ) => {
190- if (i === n ) {
191- res .push ([... nums ]);
184+ if (i >= n ) {
185+ ans .push (t .slice ());
186+ return ;
192187 }
193- for (let j = i ; j < n ; j ++ ) {
194- [nums [i ], nums [j ]] = [nums [j ], nums [i ]];
195- dfs (i + 1 );
196- [nums [i ], nums [j ]] = [nums [j ], nums [i ]];
188+ for (let j = 0 ; j < n ; ++ j ) {
189+ if (! vis [j ]) {
190+ vis [j ] = true ;
191+ t [i ] = nums [j ];
192+ dfs (i + 1 );
193+ vis [j ] = false ;
194+ }
197195 }
198196 };
199197 dfs (0 );
200- return res ;
198+ return ans ;
201199}
202200```
203201
204202#### Rust
205203
206204``` rust
207205impl Solution {
208- fn dfs ( i : usize , nums : & mut Vec <i32 >, res : & mut Vec <Vec <i32 >>) {
206+ pub fn permute ( nums : Vec <i32 >) -> Vec <Vec <i32 >> {
209207 let n = nums . len ();
210- if i == n {
211- res . push (nums . clone ());
212- return ;
213- }
214- for j in i .. n {
215- nums . swap (i , j );
216- Self :: dfs (i + 1 , nums , res );
217- nums . swap (i , j );
208+ let mut ans = Vec :: new ();
209+ let mut t = vec! [0 ; n ];
210+ let mut vis = vec! [false ; n ];
211+ fn dfs (
212+ nums : & Vec <i32 >,
213+ n : usize ,
214+ t : & mut Vec <i32 >,
215+ vis : & mut Vec <bool >,
216+ ans : & mut Vec <Vec <i32 >>,
217+ i : usize
218+ ) {
219+ if i == n {
220+ ans . push (t . clone ());
221+ return ;
222+ }
223+ for j in 0 .. n {
224+ if ! vis [j ] {
225+ vis [j ] = true ;
226+ t [i ] = nums [j ];
227+ dfs (nums , n , t , vis , ans , i + 1 );
228+ vis [j ] = false ;
229+ }
230+ }
218231 }
219- }
220-
221- pub fn permute (mut nums : Vec <i32 >) -> Vec <Vec <i32 >> {
222- let mut res = vec! [];
223- Self :: dfs (0 , & mut nums , & mut res );
224- res
232+ dfs (& nums , n , & mut t , & mut vis , & mut ans , 0 );
233+ ans
225234 }
226235}
227236```
@@ -236,23 +245,22 @@ impl Solution {
236245var permute = function (nums ) {
237246 const n = nums .length ;
238247 const ans = [];
239- const t = [] ;
240- const vis = new Array (n).fill (false );
241- function dfs ( i ) {
248+ const vis = Array (n). fill ( false ) ;
249+ const t = Array (n).fill (0 );
250+ const dfs = i => {
242251 if (i >= n) {
243- ans .push ([ ... t] );
252+ ans .push (t . slice () );
244253 return ;
245254 }
246255 for (let j = 0 ; j < n; ++ j) {
247256 if (! vis[j]) {
248257 vis[j] = true ;
249- t . push ( nums[j]) ;
258+ t[i] = nums[j];
250259 dfs (i + 1 );
251260 vis[j] = false ;
252- t .pop ();
253261 }
254262 }
255- }
263+ };
256264 dfs (0 );
257265 return ans;
258266};
0 commit comments