class Solution {
private List<List<Integer>> res = new ArrayList<>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
List<Integer> path = new ArrayList<>();
Arrays.sort(candidates);
backtrack(path,candidates,target,0,0);
return res;
}
private void backtrack(List<Integer> path,int[] candidates,int target,int sum,int begin) {
if(sum == target) {
res.add(new ArrayList<>(path));
return;
}
for(int i = begin;i < candidates.length;i++) {
int rs = candidates[i] + sum;
if(rs <= target) {
path.add(candidates[i]);
//因为是排序之后的,所以后面的循环不会用到前面的数
backtrack(path,candidates,target,rs,i);//每个数字可以被无限制重复选取,因此搜索的下标仍为i,对于第一个循环,i=0,所以可以无限取第一个数,对于第二个循环,可以无限取第二个数,而取不到第一个数
path.remove(path.size()-1);
} else {
break;//rs > target 说明该分支不成立,没必要往下进行,break
}
}
}
}
力扣39. 组合总和
最新推荐文章于 2022-10-25 16:15:12 发布