最近遇到这么一个题目,给定一个数字集合a,和一个目标值t,找到集合a中所有和为t的数字组合,一个数字,可以多次出现。(集合和t都为正整数)
例子:
输入[2,3,6,7],t=7
输出:[[7],[2,2,3]]

#!/usr/bin/env python
candidate=[2,5,1]
list=[]
result=[]
def search(candidates,target,list):
	if (sum(list)==target)://回溯点
		list.sort()
		if list not in result:
			result.append(list)
		return
	if (sum(list)>target):
		return
	for i in range(len(candidate)):
		search(candidates,target,list+[candidates[i]])
search(candidate,7,list)
print(result)

其基本思想是回溯法
回溯法是暴力法的升级版本,问题的解决是一步一步向下进行的,而每一步又会有有限个选项步,则可以构建一棵多叉树,每个根节点如果匹配则进入该节点的子节点,继续向下匹配,匹配失败则回到父节点的其他子节点向下匹配,如果父节点的所有节点都无法向下匹配成功,则回溯到父节点的父节点,访问爷爷节点的其他字节点,这个过程可以由递归来实现,也就可以用栈来实现和理解。我们便利所有的元素,让其成为入口,也就是根节点,这个时候根节点的方法入栈,如果根节点匹配了,继续向根节点的子节点访问,根节点的子节点的方法入栈,如果该根节的子节点都无法匹配,则该子节点出栈,回溯根节点的其他子节点,继续。如果完全匹配,则返回成功。如果完全便利,都没能匹配,则返回失败。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐