本题来自leetcode,初步理解回溯之后,这道题,给了我非常大的对于回溯的感觉,这道题不难,但是我也是参考了别人的思路,才算是初步看到了回溯的力量。
Leet_39
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。 对于给定的输入,保证和为 target 的不同组合数少于 150 个。
//结果集
List> res = new ArrayList<>();
//存储过程
List path = new ArrayList<>();
//调用方法
public List> combinationSum(int[] candidates, int target) {
//先把提供的数组排序
Arrays.sort(candidates);
//调用
backtracking(res,path,candidates,target,0,0);
return res;
}
public void backtracking(List> res,List path,
int[] candidates,int target,int sum,int index){
if(sum==target){
res.add(new ArrayList<>(path));
return;
}
//只能找比自己更大 或者和自己相同的 因为小的在小的本身查找的时候就已经把自己的情况找完了
for(int i=index;itarget) break;//如果直接就大于的话 也没有继续找的必要
path.add(candidates[i]);
backtracking(res,path,candidates,target,sum+candidates[i],i);
path.remove(path.size()-1);//回溯移除
}
}
作为一个初学者很有触动,欢迎大家评论留言,交流学习。



