题意:找出和为target的组合
算法思路:
首先将数组拍个序,然后进入递归方法,如果target等于当前元素,则加入该组合,为防止组合重复,有2种方式解决,第一,结果中不包含该组合则加入结果;第二,在尝试下一个元素时,检查当前元素是否和下一个元素相等,相等则跳过,不相等则继续。如果target大于当前元素,暂存当前元素,递归进入下一个元素查找,target相应减去当前元素值,查找完成后,除去当前元素,尝试替换为下一个元素。如果target小于当前元素值,返回即可。
参考代码:
public static List<List<Integer>> combinationSum2(int[] candidates, int target) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
if(candidates.length==0||candidates.length==1&&candidates[0]!=target)
return ans;
List<Integer> temp = new ArrayList<Integer>();
Arrays.sort(candidates);
findCombinationSum2(candidates,ans,0,target,temp);
return ans;
}
public static void findCombinationSum2(int[] candidates, List<List<Integer>> ans, int start, int target,
List<Integer> temp) {
for (int i = start; i < candidates.length; i++) {
if (target == candidates[i]) {
temp.add(target);
//System.out.println("ans :"+temp);
if (!ans.contains(temp))
ans.add(new ArrayList<Integer>(temp));
temp.remove(temp.size()-1);
return;
} else if (target > candidates[i]) {
temp.add(candidates[i]);
//System.out.println("temp.add :"+temp);
findCombinationSum2(candidates, ans, i + 1, target - candidates[i], temp);
temp.remove(temp.size() - 1);
//System.out.println("temp.remove :"+temp);
} else {
return;
}
}
}