Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C may only be used once in the combination.
Note:
- All numbers (including target) will be positive integers.
- The solution set must not contain duplicate combinations.
For example, given candidate set [10, 1, 2, 7, 6, 1, 5]
and target 8
,
A solution set is:
[ [1, 7], [1, 2, 5], [2, 6], [1, 1, 6] ]
例如1,1,1,1 target为2,输出[1,1]
思路:按照dfs遍历。麻烦的是元素中可能存在重复的元素,但结果里去不能有重复的结果。所以两种办法:第一种是穷举所有结果,再去重;第二种是便利时就不考虑重复结果。第二种更方便一些。
下图是一个例子,圆圈与方框是表示当前已保存的元素,三角是正在遍历的元素,圆圈与方框中元素相同即被看成是同一种情况。
class Solution {
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
List<List<Integer>> list = new ArrayList<>();
Arrays.sort(candidates);
dfs(candidates,0,0,target,list);
return list;
}
static int[] index = new int[10000];
public static void dfs(int[] candidates,int sum,int i,int target,List list){
if(sum>target) return;
if(sum==target){
ArrayList<Integer> l = new ArrayList();
for(int j=0;j<candidates.length;j++){
if(index[j]!=0){
l.add(candidates[j]);
}
}
list.add(l);
return;
}else{
for(int j = i ;j<candidates.length;j++){
if(j>i&&candidates[j]==candidates[j-1]) continue;
index[j]++;
dfs(candidates,sum+candidates[j],j+1,target,list);
index[j]--;
}
}
}
}