39. 组合总和 - 力扣(LeetCode)
class Solution {
private:vector<vector<int>>result;vector<int>path;void backtracking(vector<int>& candidates, int target,int sum,int startIndex){if(sum>target){return;}if(sum==target){result.push_back(path);return;}for(int i=startIndex;i<candidates.size();i++){path.push_back(candidates[i]);sum+=candidates[i];backtracking(candidates,target,sum,i);sum-=candidates[i];path.pop_back();}}
public:vector<vector<int>> combinationSum(vector<int>& candidates, int target) {backtracking(candidates,target,0,0);return result;}
};
这道题的搜索过程可以构造成树形结构,与其他组合问题不同的是可以再次搜索自己本身,最后找到路径和等于目标值。
终止条件:路径和如果大于目标值,则返回到上一次递归;如果路径和与目标值相等,则将路径数组的值push进result数组中。
单层递归逻辑:定义一个数startIndex来统计遍历到数组的哪一个数,遍历这个数本身到最后的所有数,将遍历的数push入path数组中,定义sum统计遍历到现在的路径和,再向下进行递归,传入的startIndex值是i,因为搜索的值可以是自己本身。为了返回到上一层再进行新递归,所以要进行回溯算法,sum值减去加入的值,path数组pop出刚刚push进的值。