给定一个无重复元素的数组 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]
]
题解:如果数组元素不能重复使用,只要用深搜遍历所有情况就行了,但题目允许数组元素重复,其实这和不能重复使用数组元素求和,只不过是在进行下一次递归开始位置变一下就行了。
不能重复使用数组元素:dfs(res,tmp,nums,i+1,n-nums[i],k);
能重复使用数组元素:dfs(res,tmp,nums,i,n-nums[i],k);
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
Arrays.sort(candidates);
List<List<Integer>> res=new ArrayList<>();
dfs(res,new ArrayList<>(),candidates,0,target);
return res;
}
public static void dfs(List<List<Integer>> res,List<Integer> tmp,int[] candidates,int s,int target){
if(target<0)
return;
if(target==0){
res.add(new ArrayList<>(tmp));
return;
}
for(int i=s;i<candidates.length;i++){
tmp.add(candidates[i]);
dfs(res,tmp,candidates,i,target-candidates[i]);
tmp.remove(tmp.size()-1);
}
}
}