题目:给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个。
提示:
1 <= candidates.length <= 30
1 <= candidates[i] <= 200
candidate 中的每个元素都 互不相同
1 <= target <= 500
这道题的解题思路就是回溯和递归
用例子示意图表示:
回溯的意思就是如果加上这个元素不能够成为target值的话,可以直接返回上一数据
因为递归需要一个函数,所以我们在本道题中直接构建一个新函数dfs
void dfs(vector<int> &cand, int x, int target)
{
if (target < 0)
{
return;
}
if (target == 0)
{
v.push_back(vet);
return;
}
for (int i = x; i < cand.size(); i++)
{
vet.push_back(cand[i]);
dfs(cand, i, target - cand[i]);
vet.pop_back();
}
如果每个target值减去组合中某一数值时,如果小于0,会用pop_back()删除最后的元素。
回溯到原来的组合中
需要在整个全局变量中定义一阶和二阶容器vector
vector<int> vet;
vector<vector<int>> v;
最后在主函数中调用dfs()函数,可以直接return 返回
完整代码:
class Solution
{
vector<int> vet;
vector<vector<int>> v;
public:
vector<vector<int>> combinationSum(vector<int> &candidates, int target)
{
dfs(candidates, 0, target);
return v;
}
void dfs(vector<int> &cand, int x, int target)
{
if (target < 0)
{
return;
}
if (target == 0)
{
v.push_back(vet);
return;
}
for (int i = x; i < cand.size(); i++)
{
vet.push_back(cand[i]);
dfs(cand, i, target - cand[i]);
vet.pop_back();
}
}
};
欢迎各位读者的补充!