@@ -62,22 +62,14 @@ Similar problems:
62
62
``` python
63
63
class Solution :
64
64
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:
75
67
ans.append(t[:])
76
68
return
77
- for j in range (n ):
69
+ for j, x in enumerate (nums ):
78
70
if not vis[j]:
79
71
vis[j] = True
80
- t[i] = nums[j]
72
+ t[i] = x
81
73
dfs(i + 1 )
82
74
vis[j] = False
83
75
@@ -133,7 +125,7 @@ public:
133
125
vector<vector<int >> ans;
134
126
vector<int > t(n);
135
127
vector<bool > vis(n);
136
- function<void(int)> dfs = [ &] (int i) {
128
+ auto dfs = [ &] (this auto&& dfs, int i) -> void {
137
129
if (i == n) {
138
130
ans.emplace_back(t);
139
131
return;
@@ -166,10 +158,10 @@ func permute(nums []int) (ans [][]int) {
166
158
ans = append(ans, slices.Clone(t))
167
159
return
168
160
}
169
- for j, v := range nums {
161
+ for j, x := range nums {
170
162
if !vis[j] {
171
163
vis[j] = true
172
- t[i] = v
164
+ t[i] = x
173
165
dfs(i + 1)
174
166
vis[j] = false
175
167
}
@@ -185,43 +177,60 @@ func permute(nums []int) (ans [][]int) {
185
177
``` ts
186
178
function permute(nums : number []): number [][] {
187
179
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 );
189
183
const dfs = (i : number ) => {
190
- if (i === n ) {
191
- res .push ([... nums ]);
184
+ if (i >= n ) {
185
+ ans .push (t .slice ());
186
+ return ;
192
187
}
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
+ }
197
195
}
198
196
};
199
197
dfs (0 );
200
- return res ;
198
+ return ans ;
201
199
}
202
200
```
203
201
204
202
#### Rust
205
203
206
204
``` rust
207
205
impl 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 >> {
209
207
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
+ }
218
231
}
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
225
234
}
226
235
}
227
236
```
@@ -236,23 +245,22 @@ impl Solution {
236
245
var permute = function (nums ) {
237
246
const n = nums .length ;
238
247
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 => {
242
251
if (i >= n) {
243
- ans .push ([ ... t] );
252
+ ans .push (t . slice () );
244
253
return ;
245
254
}
246
255
for (let j = 0 ; j < n; ++ j) {
247
256
if (! vis[j]) {
248
257
vis[j] = true ;
249
- t . push ( nums[j]) ;
258
+ t[i] = nums[j];
250
259
dfs (i + 1 );
251
260
vis[j] = false ;
252
- t .pop ();
253
261
}
254
262
}
255
- }
263
+ };
256
264
dfs (0 );
257
265
return ans;
258
266
};
0 commit comments