您的位置:首页 > 其它

Combination Sum II:允许重复的数组中选取若干元素使和为某一给定值

2017-10-06 13:38 435 查看
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]--;
}
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐