题目描述:给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
说明:
所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。
解题思路:依然是回溯,需要考虑重复元素,而且组合问题的话,就是一旦考虑了,之后就不需要考虑,所以不像排列那样需要交换,直接考虑剩下的元素就可以了,代码如下:
class Solution:
def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
res = []
candidates.sort()
n = len(candidates)
def traceback(i, target, path):
if target < 0: return
if target == 0:
res.append(path[:])
return
# s = set()
for j in range(i, n):
if j != i and candidates[j] == candidates[j-1]:
continue
# s.add(candidates[j])
path.append(candidates[j])
traceback(j+1, target-candidates[j], path)
path.pop()
traceback(0, target, [])
return res