- 组合总和
难度中等763
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target
的组合。candidates 中的数字可以无限制重复被选取。
说明:
- 所有数字(包括 target)都是正整数。
- 解集不能包含重复的组合。
示例 1:
输入:candidates = [2,3,6,7], target = 7, 所求解集为: [ [7], [2,2,3] ]
// 剪枝+回溯
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<List<Integer>> res = new ArrayList<>();
int len = candidates.length;
Arrays.sort(candidates);//提前终止所搜索
dfs(candidates,len,target,0,new ArrayDeque<>(),res);
return res;
}
/***
*
len = 长度
residue = 剩余数值
begin =开始起点
path = 路径
res = 结果集变量
*/
private void dfs(int [] candidates,int len,int residue,int begin,Deque<Integer> path,List<List<Integer>> res){
if(residue == 0){
res.add(new ArrayList<>(path));
return;
}
for(int i=begin;i<len;i++){
//剪枝操作
if(residue - candidates[i] < 0){
break;
}
path.addLast(candidates[i]);//记录路径
dfs(candidates,len,residue-candidates[i],i,path,res);
path.removeLast();//撤销选择
}
}