给定一个无重复元素的数组 candidates
和一个目标数 target
,找出 candidates
中所有可以使数字和为 target
的组合。
candidates
中的数字可以无限制重复被选取。
说明:
- 所有数字(包括 target)都是正整数。
- 解集不能包含重复的组合。
示例 1:
输入:candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]
示例 2:
输入:candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
思路与代码
回溯算法+剪枝
class Solution {
List<List<Integer>> res = new ArrayList();
List<Integer> path = new ArrayList();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
Arrays.sort(candidates);
backtrack(candidates, 0, target, 0);
return res;
}
public void backtrack(int[] candidates, int start, int target, int sum) {
if (sum == target){
res.add(new ArrayList(path));
return;
}
if (candidates[start] + sum > target) return;
// 提前剪枝 这里用 candidates[start] + sum > target 不用 sum > target条件 可以加速
for (int i = start; i < candidates.length; i++){
path.add(candidates[i]);
backtrack(candidates, i, target, candidates[i] + sum);
path.remove(path.size() - 1);
}
}
}