leetcode第39题,回溯题,要求用给定集合中的数字使得相加等于目标数字,其中给定集合中的数字可以无限次使用。
注意,这里题目要求所有数字都是正数,这就保证了递归的出口条件。
分析问题,首先,递归的出口条件有两个,一个是相加出现了目标和,那么就加入了结果列表,返回。另外,由于给定集合都是正数,所以相加如果超过了目标和,就要立即返回。然后遍历集合,不断向下递归搜索。
还有一个比较关键的问题,就是如何去重。这里我们先把目标集合排一下序,然后在递归搜索的时候先判断要加入的数字和之前列表中最后一个数字的大小关系,这样就确保了我们搜索出来的结果一定是一个递增的关系,这样就会不会重复了。
class Solution(object):
def combinationSum(self, candidates, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
n = len(candidates)
candidates.sort()
ans = []
def dfs(tryList):
if sum(tryList) == target:
ans.append(tryList)
return
if sum(tryList) > target:
return
for i in range(n):
if len(tryList) != 0 and candidates[i] < tryList[-1]:
continue
dfs(tryList+[candidates[i]])
dfs([])
return ans