给定一组候选数(C)和目标数(T),在C中找到所有唯一组合,其中候选数之和等于T。可以从C无限次中选择相同的重复数。
注意:所有数字(包括目标)将为正整数。组合中的元素(a1,a2,…,ak)必须按降序排列。(即a1 <= a2 <= … <= ak)。解决方案集不得包含重复的组合。例如,给定候选集2、3、6、7和目标7,解决方案集为:
[7]
[2,2,3]
Java解决方案
此问题的第一印象应该是深度优先搜索(DFS)。为了解决DFS问题,递归是一种正常的实现。
以下示例显示了DFS的工作方式:
public List<List> combinationSum(int[] candidates, int target) {
List<List> result = new ArrayList<>();
List temp = new ArrayList<>();
helper(candidates, 0, target, 0, temp, result);
return result;}
private void helper(int[] candidates, int start, int target, int sum,
List list, List<List> result){
if(sum>target){
return;
}
if(sum==target){
result.add(new ArrayList<>(list));
return;
}
for(int i=start; i<candidates.length; i++){
list.add(candidates[i]);
helper(candidates, i, target, sum+candidates[i], list, result);
list.remove(list.size()-1);
}}
最后,开发这么多年我也总结了一套学习Java的资料与面试题,如果你在技术上面想提升自己的话,可以关注我,私信发送领取资料或者在评论区留下自己的联系方式,有时间记得帮我点下转发让跟多的人看到哦。