难度: 中等
频次:19
题目:
给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用 一次 。
注意:解集不能包含重复的组合。
解题思路:回溯
注意:
- 注意这里是不能出现顺序不一样,但是内容一样的结果
- 还是用for,然后start+1 这是全遍历结果
- 上面的结果还会出现重复的,所以需要减枝
- 减枝: 先排序,然后如果在同一个节点下,如果两个节点的大小相同,那后面的节点可以剪掉
代码
class Solution {
public List<List<Integer>> combinationSum2(int[] candidates, int target) {
List<List<Integer>> res=new ArrayList<>();
List<Integer> path=new ArrayList<>();
Arrays.sort(candidates);
dfs(candidates,target,0,0,res,path);
return res;
}
public void dfs(int[] candidates,int target,int start,int depth, List<List<Integer>> res,List<Integer> path){
if(target<0) return;
if(target==0) {
res.add(new ArrayList<Integer>(path));
return;
}
for(int i=start;i<candidates.length;i++){
if(i-1>=start&&candidates[i-1]==candidates[i]) continue;
path.add(candidates[i]);
dfs(candidates,target-candidates[i],i+1,depth+1,res,path);
path.remove(path.size()-1);
}
}
}