给定一个无重复元素的数组 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]
]
思路:在代码里面注释
java版:
class Solution {
//不重复不遗漏
public static List<List<Integer>> ans = new ArrayList<List<Integer>>();
public static int[] path = new int[100];
public static int len = 0;
public void robot(int idx,int[] candidates,int target){
if(target == 0){
//记录结果
List<Integer> tmp = new ArrayList<Integer>();
for (int i = 0;i < len ;i++) {
tmp.add(path[i]);
}
ans.add(tmp);
return ;
}
if(target < 0 || idx >= candidates.length){
return ;
}
//use
path[len] = candidates[idx];
len++;
robot(idx,candidates,target - candidates[idx]);
len--;
//not use
robot(idx + 1,candidates,target);
}
public List<List<Integer>> combinationSum(int[] candidates, int target) {
ans.clear();
robot(0,candidates,target );
return ans;
}
}
class Solution:
def combinationSum(self, candidates, target):
"""
:type candidates: List[int]
:type target: int
:rtype: List[List[int]]
"""
self.ans = []
candidates = sorted(candidates)
self.robot(candidates,[],target,0)
return self.ans
def robot(self,c,sub,target,last):
if target == 0:
self.ans.append(sub[:])
if target < c[0]:
return
for n in c:
if n > target:
return
if n < last:
continue
sub.append(n)
self.robot(c,sub,target - n,n)
sub.pop()