给定一个无重复元素的数组 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]
]
public class Solution {
public List<List<Integer>> combinationSum(int[] nums, int target) {
List<List<Integer>> list = new ArrayList<>();
Arrays.sort(nums);
backtrack(list, new ArrayList<>(), nums, 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);
}
}
}
}
组合总和
class Solution {
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
Arrays.sort(candidates);
List<List<Integer>> L = new ArrayList<>();
List<Integer> list = new ArrayList<>();
combination(candidates, L, list, target, 0);
return L;
}
static void combination(int[] candidates, List<List<Integer>> L, List<Integer> list, int target, int index) {
if (target == 0) {
//L.add(list);
L.add(new ArrayList(list));
return ;
}else if (target < 0){
return ;
}else {
for (int i = index; i < candidates.length; i++) {
if(i > index && candidates[i] == candidates[i-1]) continue;
list.add(candidates[i]);
combination(candidates, L, list, target - candidates[i], i + 1);
list.remove(list.size() - 1);
}
}
}
}
网友评论