分析:
由于结果数组要求元素有序,所以在一开始便对原数组进行排序。之后调用回溯函数,与求组合那题的不同之处在于,循环里面递归调用回溯函数中的level参数使用i而非i+1,因为题中允许存在重复元素。
public static List<List<Integer>> combinationSum2(int[] candidates, int target) {
List<List<Integer>> ll = new ArrayList<>();
Arrays.sort(candidates);
dfs(candidates,target,ll,new ArrayList<Integer>(),0);
return ll;
}
private static void dfs(int[] candidates, int target, List<List<Integer>> ll, ArrayList<Integer> l, int start) {
if(target==0){
ll.add(new ArrayList<>(l));
return;
}
for (int i = start ; i < candidates.length; i++) {
if(candidates[i] <= target){
l.add(candidates[i]);
dfs(candidates,target-candidates[i],ll,l,i);
l.remove(l.size()-1);
}else return;
}
}
若结果集中不能重复利用数字,需对添加去重条件LeetCode-40. 组合总和 II