leetcode39
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取(无重复)。
输入:candidates = [2,3,6,7], target = 7,
所求解集为:
[[7],[2,2,3]]
class Solution {
static List<List<Integer>> res=new ArrayList<>();
static List<Integer> list=new ArrayList<>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
Arrays.sort(candidates);
helper(0,candidates,target);
return res;
}
public void helper(int start,int[] candidates, int target){
if(target==0){
res.add(new ArrayList<Integer>(list));
return;
}
for(int i=start;i<candidates.length;i++){
if(candidates[i]>target) break;
list.add(candidates[i]);
helper(i,candidates,target-candidates[i]);
list.remove(list.size()-1);
}
}
}
改动一下:
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。
示例:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[ [1, 7], [1, 2, 5],[2, 6],[1, 1, 6]]
import java.util.*;
class Solution {
List<List<Integer> > res=new ArrayList<>();
List<Integer> list=new ArrayList<>();
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
Arrays.sort(candidates);
helper(0,candidates,target);
return res;
}
public void helper(int start,int[] candidates, int target){
if(target==0){
res.add(new ArrayList<Integer>(list));
return;
}
for(int i=start;i<candidates.length;i++){
//此处做了修改
if(candidates[i]<=target){
if(i>start&&candidates[i]==candidates[i-1]){
continue;
}
list.add(candidates[i]);
helper(i+1,candidates,target-candidates[i]);
list.remove(list.size()-1);
}
}
}
}