@@ -211,44 +211,68 @@ class Solution {
211
211
```
212
212
213
213
Python:
214
+ ** 回溯**
214
215
``` python3
215
216
class Solution :
217
+ def __init__ (self ):
218
+ self .path = []
219
+ self .paths = []
220
+
216
221
def permute (self , nums : List[int ]) -> List[List[int ]]:
217
- res = [] # 存放符合条件结果的集合
218
- path = [] # 用来存放符合条件的结果
219
- used = [] # 用来存放已经用过的数字
220
- def backtrack (nums ,used ):
221
- if len (path) == len (nums):
222
- return res.append(path[:]) # 此时说明找到了一组
223
- for i in range (0 ,len (nums)):
224
- if nums[i] in used:
225
- continue # used里已经收录的元素,直接跳过
226
- path.append(nums[i])
227
- used.append(nums[i])
228
- backtrack(nums,used)
229
- used.pop()
230
- path.pop()
231
- backtrack(nums,used)
232
- return res
222
+ '''
223
+ 因为本题排列是有序的,这意味着同一层的元素可以重复使用,但同一树枝上不能重复使用(usage_list)
224
+ 所以处理排列问题每层都需要从头搜索,故不再使用start_index
225
+ '''
226
+ usage_list = [False ] * len (nums)
227
+ self .backtracking(nums, usage_list)
228
+ return self .paths
229
+
230
+ def backtracking (self , nums : List[int ], usage_list : List[bool ]) -> None :
231
+ # Base Case本题求叶子节点
232
+ if len (self .path) == len (nums):
233
+ self .paths.append(self .path[:])
234
+ return
235
+
236
+ # 单层递归逻辑
237
+ for i in range (0 , len (nums)): # 从头开始搜索
238
+ # 若遇到self.path里已收录的元素,跳过
239
+ if usage_list[i] == True :
240
+ continue
241
+ usage_list[i] = True
242
+ self .path.append(nums[i])
243
+ self .backtracking(nums, usage_list) # 纵向传递使用信息,去重
244
+ self .path.pop()
245
+ usage_list[i] = False
233
246
```
234
-
235
- Python(优化,不用used数组):
247
+ ** 回溯+丢掉usage_list**
236
248
``` python3
237
249
class Solution :
250
+ def __init__ (self ):
251
+ self .path = []
252
+ self .paths = []
253
+
238
254
def permute (self , nums : List[int ]) -> List[List[int ]]:
239
- res = [] # 存放符合条件结果的集合
240
- path = [] # 用来存放符合条件的结果
241
- def backtrack (nums ):
242
- if len (path) == len (nums):
243
- return res.append(path[:]) # 此时说明找到了一组
244
- for i in range (0 ,len (nums)):
245
- if nums[i] in path: # path里已经收录的元素,直接跳过
246
- continue
247
- path.append(nums[i])
248
- backtrack(nums) # 递归
249
- path.pop() # 回溯
250
- backtrack(nums)
251
- return res
255
+ '''
256
+ 因为本题排列是有序的,这意味着同一层的元素可以重复使用,但同一树枝上不能重复使用
257
+ 所以处理排列问题每层都需要从头搜索,故不再使用start_index
258
+ '''
259
+ self .backtracking(nums)
260
+ return self .paths
261
+
262
+ def backtracking (self , nums : List[int ]) -> None :
263
+ # Base Case本题求叶子节点
264
+ if len (self .path) == len (nums):
265
+ self .paths.append(self .path[:])
266
+ return
267
+
268
+ # 单层递归逻辑
269
+ for i in range (0 , len (nums)): # 从头开始搜索
270
+ # 若遇到self.path里已收录的元素,跳过
271
+ if nums[i] in self .path:
272
+ continue
273
+ self .path.append(nums[i])
274
+ self .backtracking(nums)
275
+ self .path.pop()
252
276
```
253
277
254
278
Go:
0 commit comments