Update 0046.全排列.md

This commit is contained in:
jianghongcheng
2023-05-27 20:53:39 -05:00
committed by GitHub
parent a6c95b78e8
commit b033a08c13

View File

@ -213,68 +213,27 @@ class Solution {
``` ```
### Python ### Python
**回溯** 回溯 使用used
```python ```python
class Solution: class Solution:
def __init__(self): def permute(self, nums):
self.path = [] result = []
self.paths = [] self.backtracking(nums, [], [False] * len(nums), result)
return result
def permute(self, nums: List[int]) -> List[List[int]]: def backtracking(self, nums, path, used, result):
''' if len(path) == len(nums):
因为本题排列是有序的,这意味着同一层的元素可以重复使用,但同一树枝上不能重复使用(usage_list) result.append(path[:])
所以处理排列问题每层都需要从头搜索故不再使用start_index
'''
usage_list = [False] * len(nums)
self.backtracking(nums, usage_list)
return self.paths
def backtracking(self, nums: List[int], usage_list: List[bool]) -> None:
# Base Case本题求叶子节点
if len(self.path) == len(nums):
self.paths.append(self.path[:])
return return
for i in range(len(nums)):
# 单层递归逻辑 if used[i]:
for i in range(0, len(nums)): # 从头开始搜索
# 若遇到self.path里已收录的元素跳过
if usage_list[i] == True:
continue continue
usage_list[i] = True used[i] = True
self.path.append(nums[i]) path.append(nums[i])
self.backtracking(nums, usage_list) # 纵向传递使用信息,去重 self.backtracking(nums, path, used, result)
self.path.pop() path.pop()
usage_list[i] = False used[i] = False
```
**回溯+丢掉usage_list**
```python
class Solution:
def __init__(self):
self.path = []
self.paths = []
def permute(self, nums: List[int]) -> List[List[int]]:
'''
因为本题排列是有序的,这意味着同一层的元素可以重复使用,但同一树枝上不能重复使用
所以处理排列问题每层都需要从头搜索故不再使用start_index
'''
self.backtracking(nums)
return self.paths
def backtracking(self, nums: List[int]) -> None:
# Base Case本题求叶子节点
if len(self.path) == len(nums):
self.paths.append(self.path[:])
return
# 单层递归逻辑
for i in range(0, len(nums)): # 从头开始搜索
# 若遇到self.path里已收录的元素跳过
if nums[i] in self.path:
continue
self.path.append(nums[i])
self.backtracking(nums)
self.path.pop()
``` ```
### Go ### Go