Leetcode Link: 46. 全排列 - 力扣(LeetCode)
题目
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

解法一
思路:回溯的排列问题,排列问题不同于子集问题,同样的元素组成,不同的顺序,算两个结果。
显然本题收集的是叶子节点
满足题目的条件:
- 走到了叶子节点,即
nums中所有的数字全都用了len(path)==len(nums)
停止回溯的条件:
- 同上,没有特殊情况需要停止回溯
剪枝:
- 遇到已经用过的数字的时候,需要跳过,即不能
val in path==True
本题特殊在输入 nums 中的数字都是不一样的,加上本题属于排列问题,那么每层的 choose 实际上就是 nums 自己。
但是需要注意的是已经用过的数字(即在path中的数字)不能重复使用
题解:
class Solution:
def permute(self, nums: List[int]) -> List[List[int]]:
def backtracking():
nonlocal nums, res, path
# 满足条件,收集叶节点,停止递归
if len(path) == len(nums):
res.append(copy.deepcopy(path))
return
# 本题其每次的choose就是nums自己
for val in nums:
# 本题中 nums 无重复数字,那么就要保证path中别重复用一个数字
if val not in path:
path.append(val)
backtracking()
path.pop()
else:
continue
res = []
path = []
backtracking()
return res
解法二
思路:
题解:
解法三
思路:
题解: