题目描述
给定一个无重复元素的数组 candidates
和一个目标数 target
,找出 candidates
中所有可以使数字和为 target
的组合。
candidates
中的数字可以无限制重复被选取。
说明:
- 所有数字(包括
target
)都是正整数。 - 解集不能包含重复的组合。
示例 1:
输入: candidates = [2,3,6,7], target = 7, 所求解集为: [ [7], [2,2,3] ]
示例 2:
输入: candidates = [2,3,5], target = 8, 所求解集为: [ [2,2,2,2], [2,3,3], [3,5] ]
问题分析
这是一道DFS的题,DFS函数的可变参数有3个:target、start、out,其中target是当前剩余待组合的目标数,start是一个标志,代表之后从start位开始往后进行,是用来防止重复的。out是当前数组的状态。递归基有两个,当target小于0时,表示已经不存在了,直接返回;当target等于0时,表示当前的out已经满足,将其加入到ans中并返回。当target大于0时不满足递归基,正常进行,从start位开始往后进行for循环,分别将每一个数加入out,并将新的参数传入进行DFS,待DFS这行执行完后,将out进行pop_back,把尾部的数取出,并准备在下一轮for循环加入新的数。结束后最终返回ans。
代码实现
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> ans;
vector<int> out;
DFS(candidates, target, 0, out, ans);
return ans;
}
void DFS(vector<int>& candidates, int target, int start, vector<int>& out, vector<vector<int>>& ans){
if(target < 0)
return;
if(target == 0){
ans.push_back(out);
return;
}
for(int i = start; i < candidates.size(); i++){
out.push_back(candidates[i]);
DFS(candidates, target - candidates[i], i, out, ans);
out.pop_back();
}
}
};