mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-09 11:34:46 +08:00
Update 0046.全排列.md
This commit is contained in:
@ -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
|
||||||
|
Reference in New Issue
Block a user