Skip to content

Commit 5234228

Browse files
Merge pull request youngyangyang04#841 from casnz1601/patch-18
Update 0046.全排列.md
2 parents 04a5cd8 + 6850228 commit 5234228

File tree

1 file changed

+55
-31
lines changed

1 file changed

+55
-31
lines changed

problems/0046.全排列.md

Lines changed: 55 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -211,44 +211,68 @@ class Solution {
211211
```
212212

213213
Python:
214+
**回溯**
214215
```python3
215216
class Solution:
217+
def __init__(self):
218+
self.path = []
219+
self.paths = []
220+
216221
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
233246
```
234-
235-
Python(优化,不用used数组):
247+
**回溯+丢掉usage_list**
236248
```python3
237249
class Solution:
250+
def __init__(self):
251+
self.path = []
252+
self.paths = []
253+
238254
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()
252276
```
253277

254278
Go:

0 commit comments

Comments
 (0)