题目的链接在这里:https://leetcode-cn.com/problems/combination-sum/
题目大意
给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 target 的唯一组合。candidates 中的数字可以无限制重复被选取。如果至少一个所选数字数量不同,则两种组合是唯一的。
对于给定的输入,保证和为 target 的唯一组合数少于 150 个。
一、示意图
二、解题思路
回溯
回溯
代码如下:
class Solution {
List<List<Integer>> res=new LinkedList<>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
//candidates是无限制的 然后要让结果等于target
List<Integer> temp=new LinkedList<>();
//然后就开始判断
Arrays.sort(candidates);
backTrace(candidates,target,0,temp);
return res;
}
private void backTrace(int[] candidates, int target, int start, List<Integer> temp) {
//应该是判断这个位置可不可以选 因为这个位置是可以无限选的 所以是变成了 选他和不选他 也就是 从他开始 还是不从他开始
if(target==0){
//说明齐全了
//这里查重一下
if(!res.contains(temp)) {
res.add(new LinkedList<>(temp));
}
return;
}
//然后把这个作为开始的位置
for(int i=start;i<candidates.length;i++){
if(target>=candidates[start]){
//就说明这个位置可以选 但存在两个情况就是 可以是选这个 然后进行递归 也可以是不选这个 然后进行递归的
//这个是正常的 不能选这个了
temp.add(candidates[i]);
backTrace(candidates,target-candidates[i],i+1,temp);
temp.remove(temp.size()-1);
//然后再来一个 可以选这个的?
temp.add(candidates[i]);
backTrace(candidates,target-candidates[i],i,temp);
//然后删除
temp.remove(temp.size()-1);
}
}
}
}