给定一个数组 candidates
和一个目标数 target
,找出 candidates
中所有可以使数字和为 target
的组合。
candidates
中的每个数字在每个组合中只能使用一次。
说明:
- 所有数字(包括目标数)都是正整数。
- 解集不能包含重复的组合。
示例 1:
输入:candidates = [10,1,2,7,6,1,5], target = 8
所求解集为:[ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6] ]
示例 2:
输入:candidates = [2,5,2,1,2], target = 5
所求解集为:[ [1,2,2], [5] ]
递归
跟昨天的39. Combination Sum 组合总和一样,只不过加了个限制每个数字只能使用一次的条件。
Code
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
def dfs(start, use, remain):
for index, value in enumerate(candidates[start:]):
if value == remain and use + [value] not in ans:
ans.append(use + [value])
elif value < remain:
dfs(start + index + 1, use + [value], remain - value)
else:
return
ans = []
candidates.sort()
dfs(0, [], target)
return ans