题目
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]
分析
这道题目要求每个数字只能用一次,根第39道题目类似的解法,只不过在递归的时候需要注意开始坐标应该需要加1了,题目还要求不能包含重复的解,所以可以先给数组排序,然后递归的时候当前元素和上一个元素如果一样的话当前元素就可以忽略不用递归了,因为一样的元素组合出来的解肯定是一样的
java
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
public class combinationSumII {
private static List<List<Integer>> res = new ArrayList();
private static List<Integer> cur = new ArrayList();
public static void main(String[] args) {
int[] arr = {10,1,2,7,6,1,5};
Arrays.sort(arr);
getRes(arr,8,0);
for(List<Integer> lis:res) {
for(Integer data:lis) {
System.out.print(data + " ");
}
System.out.println();
}
}
public static void getRes(int[] arr,int target,int start) {
if(target < 0) {
return;
}
if(target == 0) {
res.add(new ArrayList(cur));
return;
}
int len = arr.length;
for(int i = start;i<len;i++) {
if(i > start && arr[i-1] == arr[i]) {
continue;
}
cur.add(arr[i]);
getRes(arr,target-arr[i],i+1);
cur.remove(cur.size()-1);
}
}
}