全排列问题
回溯解决全排列问题
[1,2,3];穷举,全排列问题
每次选择一个数子,利用selected记录已选择的
首先通过循环去遍历每个可能的选择,选择一个数字后,记录选择,递归进行下一次选择
#nums:给定的数组,selected:记录已选择数组,res:记录所有的组合
def all_select(nums,selected,res):
if len(selected) == len(nums):
# 如果直接添加selected则res会随着selected的更改而更改
one_re = list(selected)
return res.append(one_re)
for i in nums:
if i not in selected:
selected.append(i)
all_select(nums,selected,res)
#回溯过程中更新selected
selected.pop()
nums = [1,2,3]
selected =[]
res = []
all_select(nums,selected,res)
for i in res:
print(f"{i}\n")
若存在重复元素
若存在想等元素利用selected记录已选择的数组索引
#[1,1,3];穷举,全排列问题
每次选择一个数子,利用selected记录已选择的
首先通过循环去遍历每个可能的选择,选择一个数字后,记录选择,递归进行下一次选择
nums:给定的数组,selected:记录已选择数字所在的索引,data:记录已选择的排列组合,res:记录所有的组合
#nums:给定的数组,selected:记录已选择数组,res:记录所有的组合
def all_select(nums,selected,data,res):
# 对已原则的元素不添加到已有的排列中:data not in res
if len(data) == len(nums) and data not in res:
# 如果直接添加selected则res会随着selected的更改而更改
one_re = list(data)
return res.append(one_re)
for index, i in enumerate(nums):
if index not in selected:
selected.append(index)
data.append(i)
all_select(nums,selected,data,res)
selected.pop()
data.pop()
nums = [1,1,3]
selected =[]
res = []
data = []
all_select(nums,selected,data,res)
for i in res:
print(f"{i}\n")
重复元素的组合选择
参考代码采用剪枝操作,在for循环前创建一个set,记录已选择的组合;对已选择组合进行记录;本文采用在最后添加res前,对比已存在res
子集和问题
本题目为避免重复子集问题,利用数组的索引index来维护不同分支,可选择的元素
# 子集和问题
def sum_(nums,target,selected,res):
if target-sum(selected)==0:
res.append(list(selected))
return
#在迭代过程中,可选择的子集需要相应的较小,利用index
for index,num in enumerate(nums):
print("当前起始索引{}".format(index))
if target-sum(selected) < 0:
break
selected.append(num)
print("执行递归")
sum_(nums[index:],target,selected,res)
print("回溯:更新已选择的数字")
selected.pop()
nums = [3,4,5]
target = 9
selected = []
res = []
data = []
sum_(nums,target,selected,res)
for num in res:
print(f"{num}\n")
本文代码与参考代码略有不同:去除了状态变量
参考代码
483

被折叠的 条评论
为什么被折叠?



