题目描述
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
解题思路
1、关键点在于,如何判断数字和为 target,设置变量remain来记录是否为target
remain - nums[i]
代码
class Solution {
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> list = new ArrayList<>();
Arrays.sort(candidates);
backtrack(list, new ArrayList<>(),candidates, target, 0);
return list;
}
private void backtrack(List<List<Integer>> list, List<Integer> templist, int[] nums, int remain, int start){
if(remain < 0) return;
else if(remain == 0) list.add(new ArrayList<>(templist));
else{
for(int i = start; i < nums.length; i++){
templist.add(nums[i]);
backtrack(list, templist, nums, remain - nums[i], i);
templist.remove(templist.size() - 1);
}
}
}
}
参考:https://leetcode.com/problems/subsets/discuss/27281/A-general-approach-to-backtracking-questions-in-Java-(Subsets-Permutations-Combination-Sum-Palindrome-Partitioning)