给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
算法思路:思路:根据示例输入: candidates = [2,3,6,7],target = 7。候选数组里有 2 ,如果找到了 7 - 2 = 5 的所有组合,再在之前加上 2 ,就是 7 的所有组合;同理考虑 3,如果找到了 7 - 3 = 4 的所有组合,再在之前加上 3 ,就是 7 的所有组合,依次这样找下去;上面的思路就可以画成下面的树形图。
1.蓝色结点表示:尝试找到组合之和为该数的所有组合,怎么找呢?逐个减掉候选数组中的元素即可;
2.以 target = 7 为根结点,每一个分支做减法;
3.减到 000 或者负数的时候,到了叶子结点;
4.减到 000 的时候结算,这里 “结算” 的意思是添加到结果集;
5.从根结点到叶子结点(必须为 0)的路径,就是题目要我们找的一个组合。
<作者:liweiwei1419
链接:https://leetcode-cn.com/problems/combination-sum/solution/hui-su-suan-fa-jian-zhi-python-dai-ma-java-dai-m-2/
来源:力扣(LeetCode)>
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> res;
vector<int> tmp;
push_it(res,candidates,tmp,0,target);
return res;
}
private:
void push_it(vector<vector<int>> &res,vector<int>& candidates,vector<int> &tmp,int start,int target){
if(target==0){
res.push_back(tmp);
return;
}
for(int i = start; i<candidates.size()&&target>0 ;i++){ //剪枝以i来体现
tmp.push_back(candidates[i]);
push_it(res,candidates,tmp,i,target-candidates[i]);//i以前的数不会再push
tmp.pop_back();
}
return;
}
};