给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
示例
输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]示例
输入: candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]class Solution:
def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
# 排序后, 有助于判断什么时候终止递归
candidates.sort()
r = []
def dfs(arr, tmpArr, remain, start):
# 终止条件
if remain < 0: return
# 找到组合. 但是需要拷贝tmpArr; 因为其为数组, 在函数外依旧被调用.
# 解决方案是: 1. 当前处进行拷贝; 2. 每次传参时候拷贝(消耗内存, 不建议)
if remain == 0:
r.append(tmpArr[:])
return
# 对每个元素进行递归处理
for i in range(start, len(arr)):
# tmpArr的append/pop, 保证不会影响到各个元素的递归
# 如果不想append/pop, 则在调用dfs时候, 进行拷贝: tmpArr+[arr[i]]即可.
tmpArr.append(arr[i])
dfs(arr, tmpArr, remain - arr[i], i)
tmpArr.pop()
dfs(candidates, [], target, 0)
return r