给定一个无重复元素的数组 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]
]
思路:一般需要列出所有组合情况的问题都可以用到深度优先遍历来解决,即一条路找到底,然后返回上一层然后继续走到到底,一直到遍历所有情况,过程中将符合情况的记录下来然后返回。
因为这道题是找到组合和与target相等的,而且数字可以重复使用,所以每选择一个数就让target-当前下标对应的值,然后将所得的数传入下去,直到等于0,即找到一个组合,依次递归。
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> result;
vector<int> temp;
dfs(candidates, candidates.size(), target, result, temp, 0);
return result;
}
void dfs(vector<int>& candidates, int n, int target, vector<vector<int>>& result, vector<int>& temp, int index){
if(target<0){
return;
}else if(target==0){
result.push_back(temp);
return;
}else{
for(int i=index;i<n;++i){
temp.push_back(candidates[i]);
dfs(candidates, n, target-candidates[i], result, temp, i);
temp.pop_back();
}
}
}
};