给定一个无重复元素的数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。
candidate中的数字可以无限制重复被选取。
所有数字(包括target都是正整数)。解集不能包含重复的组合。
思路:回溯法
注意图中叶子节点的返回条件,因为本题没有组合数量要求,仅仅是总和的限制,所以递归没有层数的限制,所以递归没有层数的限制,只要选取的元素总和超过target,就返回!
// 版本一
class Solution {
private:
vector<vector<int>> result; // 存放结果集
vector<int> path; // 收集路径
void backtracking(vector<int>& candidates, int target, int sum, int startIndex) {
// 终止只有两种条件,结果超过target,直接就return了,不继续回溯,相当于剪枝
if (sum > target) {
return;
}
// 收集结果
if (sum == target) {
result.push_back(path);
return;
}
// startIndex的作用,如何知道下一层从哪个元素开始,(防止重复,集合无序)
for (int i = startIndex; i < candidates.size(); i++) {
sum += candidates[i];
path.push_back(candidates[i]);
backtracking(candidates, target, sum, i); // 不用i+1了,表示可以重复读取当前的数
sum -= candidates[i]; // 回溯
path.pop_back(); // 回溯
}
}
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
result.clear();
path.clear();
backtracking(candidates, target, 0, 0);
return result;
}
};