class Solution:
def dfs(self,L,idx):
s = sum(L)
if s == self.target: self.res.append(L)
for i in range(idx,len(self.candidates)):
if s + self.candidates[i] > self.target:break
self.dfs(L + [self.candidates[idx]],i)
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
self.res = []
candidates.sort()
self.candidates = candidates
self.target = target
for i in range(len(candidates)):
self.dfs([],i)
return self.res
这一题只要枚举出所有可能的方案即可。
当然,因为每个数可以取任意多次,所以方案数是无限的,所以需要在当前方案总和大于目标值时停止继续向下枚举。
因为本题并没有明确说明candidates列表是有序的,所以应该在使用其之前进行排序。
因为candidates列表经过了排序,所以当当前列表中的某个元素candidates[i]
和当前方案的总和的和大于目标值时,candidates
中后方的值与当前方案的和也必定大于目标值,因此可以直接结束递归。达到剪枝的效果。
dfs的内部流程如下图所示:
题目链接
原创不易,感谢支持。