题目:组合总和
给定一个无重复元素的数组 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]
]
答案:
回溯法
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> res = new ArrayList<>();
if(candidates.length < 1)
return res;
Arrays.sort(candidates);
backTrack(0,new Stack<>(),res,0,target,candidates);
return res;
}
private static void backTrack(int sum,Stack<Integer> stack,List<List<Integer>> res,int i,int target,int[] candidates) {
if(sum == target){ //结束条件
res.add(new ArrayList(stack));
return;
} else if(sum > target){
return;
}
for(int k = i; k < candidates.length; k++){
stack.add(candidates[k]); //做选择
backTrack(sum+candidates[k],stack,res,k,target,candidates); //进入下一层决策树
stack.pop(); //取消选择,返回上一层决策树
}
}
}
将数字和作为递归参数传递,因为数字可重复,所以选择当前数字及之后的数字。