问题描述
给定一个无重读元素的数组 candidates
和一个目标数 target
,找出 candidates
中所有可以使数字和为target
的组合。
candidates
中的数字可以无限制重复被选取。
说明:
- 所有数字(包括
target
)都是正整数。 - 解集不能包含重复的组合。
输入: candidates = [2,3,6,7], target = 7,
所求解集为:[[7], [2,2,3]]
解题报告
由于每个数字可以被重复使用,而且一个子集中的元素是无序的,所以我们可以认为定义每个子集都是非单调递减的或者非单调递增的,这样,就不会出现[2,2,3]和[2,3,2]这样的答案了。
实现代码
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>>ans;
vector<int>cur;
sort(candidates.begin(), candidates.end());
dfs(ans, candidates, target, target, cur);
return ans;
}
void dfs(vector<vector<int>>&ans, vector<int>& candidates, int target,
int left, vector<int>cur){
if(left==0) ans.push_back(cur);
else{
for(int i=0;i<candidates.size();i++){
if(candidates[i]>left)
break;
else if(cur.size()==0||candidates[i]>=cur.back()){
cur.push_back(candidates[i]);
dfs(ans, candidates, target, left-candidates[i], cur);
cur.pop_back();
}
}
}
}
};
参考资料
[1] Leetcode. 组合总和