题目
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
题解
1、将 candidates 从小到大排列;
2、采取深度优先的递归遍历策略。其递归格式如下:
输入: List<List<Integer>> :结果集、 List<Integer> :当前单个结果、 target :目标值、 nums :当前广度的遍历位置
输出:void
3、每次递归取数时,均将当前 target 减去 candidates 中的数,将其结果传递下去进行递归。当 target 为0时,添加 list 中的数给结果集,并终止这次递归。
4、为了避免出现重复取数的情况,例如 {2, 2, 4} 和 {4, 2, 2} 的情况,我们设定为只能够从小到大取数,因此第一步有一个对其进行排序的做法;
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> listAll=new ArrayList<List<Integer>>();
List<Integer> list=new ArrayList<Integer>();
Arrays.sort(candidates);
this.combinationsum(candidates, target, listAll, list, 0);
return listAll;
}
public void combinationsum(int[] candidates, int target, List<List<Integer>> listAll, List<Integer> list, int nums) {
if(target == 0) {
listAll.add(list);
return;
}
if(target < candidates[0]) {
return;
}
for(int i = nums; i < candidates.length && target >= candidates[i]; i++) {
List<Integer> l = new ArrayList(list);
l.add(candidates[i]);
this.combinationsum(candidates, target-candidates[i], listAll, l, i);
}
}