给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的数字可以无限制重复被选取。

说明:

  • 所有数字(包括 target)都是正整数。
  • 解集不能包含重复的组合。 

示例 1:

输入:candidates = [2,3,6,7], target = 7
所求解集为:

[
  [7],
  [2,2,3]
]


示例 2:

输入:candidates = [2,3,5], target = 8
所求解集为:
[
  [2,2,2,2],
  [2,3,3],
  [3,5]
]

 

提示:

  • 1 <= candidates.length <= 30
  • 1 <= candidates[i] <= 200
  • candidate 中的每个元素都是独一无二的。
  • 1 <= target <= 500

递归

首先把candidates排序,然后每次取一个数放进ans,将剩下的余数继续递归搜索。

Code

	def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:
		def find(start, use, remain):
			for index, value in enumerate(candidates[start:]):
				if value == remain:
					ans.append(use + [value])
				elif value < remain:
					find(start + index, use + [value], remain - value)
				else:
					return

		ans = []
		candidates.sort()
		find(0, [], target)
		return ans