回溯法寻找组合
加起来和为目标值的组合
http://www.nowcoder.com/questionTerminal/75e6cd5b85ab41c6a7c43359a74e869a
常见的使用DFS+回溯求解组合问题
private ArrayList<ArrayList<Integer>> list = new ArrayList<>();
public ArrayList<ArrayList<Integer>> combinationSum2(int[] num, int target) {
if (num == null){
return new ArrayList<>();
}
Arrays.sort(num);
findCombination(num,0,target,new ArrayList<>());
Collections.sort(list, new Comparator<ArrayList<Integer>>() {
@Override
public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
Iterator<Integer> iterator1 = o1.iterator();
Iterator<Integer> iterator2 = o2.iterator();
while (iterator1.hasNext() && iterator2.hasNext()){
Integer next1 = iterator1.next();
Integer next2 = iterator2.next();
if (next1 < next2){
return -1;
}else if (next1 > next2){
return 1;
}
}
return 0;
}
});
return list;
}
private void findCombination(int[] num,int index, int target, List<Integer> curlist){
if (target == 0){
ArrayList<Integer> newlist = new ArrayList<>(curlist);
Collections.sort(newlist);
list.add(newlist);
return;
}
if (index >= num.length || target < 0){
return;
}
for (int i = index; i < num.length; i++) {
if (i > index && num[i] == num[i-1]){
continue;
}
curlist.add(num[i]);
findCombination(num,i+1,target-num[i],curlist);
curlist.remove(curlist.size()-1);
}
}