解答:
class Solution {
public:
void dfs(vector<int>& candidates, int target, vector<vector<int>>& ans, vector<int>& combine, int idx) {
if(idx==candidates.size()){//遍历完的边界
return;
}
if(target==0){//找完了能组成和的所有数,也是边界
ans.emplace_back(combine);//把单条结果放进去
return;
}
dfs(candidates,target,ans,combine,idx+1);//如果我们不用当前idx数,要考虑下一个idx+1
//如果要用当前idx数
if(target-candidates[idx]>=0){//首先我们要确定还有空间可以用(数字全正啊,题目有说)
combine.emplace_back(candidates[idx]);//还有空间,放进单条答案里
dfs(candidates,target-candidates[idx],ans,combine,idx);//但是我们可以无限制的取当前数,所以可以继续考虑idx
combine.pop_back();//回溯的时候还原现场
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> ans;//存答案用的
vector<int> combine;//放单条答案用的
dfs(candidates,target,ans,combine,0);//从0位置开始
return ans;
}
};
时间复杂度:O(S),S为所有可行解的长度之和。
空间复杂度:O(target)。除了答案数组外,空间复杂度取决于递归的栈深度,在最差情况下需要递归O(target)层。