- 题目:给定一个数组candidates和一个数字target,从candidates中找出所有能够能够相加之和等于target的元素组合
- 难度:Medium
- 思路:利用回溯进行求解,结束条件为当target等于0的时候,就将当前list添加到result里;target大于0时,继续调用回溯方法(添加新的元素,同时target的值更新)
- 代码:
public class Solution {
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
int len = candidates.length;
if(len == 0){
return result;
}
Arrays.sort(candidates);
if(candidates[0] > target){
return result;
}
backtrack(candidates,target,0,result,new ArrayList<Integer>());
return result;
}
private void backtrack(int[] candidates, int target, int index, List<List<Integer>> result, List<Integer> list){
if(target == 0){
result.add(new ArrayList<>(list));
return;
}else if(target > 0){
if(index < candidates.length){
int last = -1;
for(int i = index; i < candidates.length; i++){
if(candidates[i] == last){
continue;
}
list.add(candidates[i]);
last = candidates[i];
backtrack(candidates,target-candidates[i],i+1,result,list);
list.remove(list.size()-1);
}
}else{
return;
}
}else{
return;
}
}
}