适用情况
需要找数组中数字的组合或排列
模式概括
回溯法
res = []
tmp = []
if <1.设置条件:把需要的当前列表加入res>:
res.append(当前列表)
return res
for 选择 in 选择列表:
<2.做选择>
<3.递归调用> backtrack(选择列表,当前列表,res)
<4.撤销选择>
图解
例一 全排列
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
Input: [1,3,5]
Output: [1,3,5], [1,5,3], [3,1,5], [3,5,1], [5,1,3], [5,3,1]
解题思路:
结合回溯法的模式,需要特别考虑的是:
- <满足条件>到达底层的条件就是选择列表nums为空
def permute(self, nums: List[int]) -> List[List[int]]:
# 函数输入为空时的特殊情况
if not nums: return nums
# 参数赋值初始化
res = []
tmp = []
# 调用backtrack函数,在类(class Solution)中要用self调用函数
self.backtrack(nums, tmp, res)
return res
def backtrack(self, nums, tmp, res): # nums是选择列表,tmp是当前选择
#<满足条件> 到达底层的条件就是选择列表nums为空
if not nums:
# 错误写法 result.append(tem_result[]) 这样把地址传入,后面回退的时候会是一堆空列表
res.append(tmp[