本题涉及到回溯,递归往往都是伴随着回溯,回溯对于初学者可能不是很好理解,要更好的理解的话还是要多做一些题目;
题目原文:
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个。
看到示例可以很明显的看出来, 数组中元素没有重复,但是答案中有重复的元素,这个需要注意。本题采用递归的思想,用c++来做本题会方便很多。
class Solution {
public:
vector<vector<int>>ret; //保存结果的数组
vector<int>path;
int sum = 0;
void dfs(vector<int>&candidates,int target,int startIndex)
{
if(sum > target) return; //剪枝,如果sum已经大于target的话,已经没有必要再递归下去了
if(sum == target)
{
ret.push_back(path);
return;
}
for(int i = startIndex;i<candidates.size();i++)
{
sum+=candidates[i];
path.push_back(candidates[i]);
dfs(candidates,target,i);
//回溯
sum-=candidates[i];
path.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
path.clear();
ret.clear();
dfs(candidates,target,0);
return ret;
}
};