Given a set of candidate numbers (candidates
) (without duplicates) and a target number (target
), find all unique combinations in candidates
where the candidate numbers sums to target
.
The same repeated number may be chosen from candidates
unlimited number of times.
Note:
- All numbers (including
target
) will be positive integers. - The solution set must not contain duplicate combinations.
Example 1:
Input: candidates =[2,3,6,7],
target =7
, A solution set is: [ [7], [2,2,3] ]
Example 2:
Input: candidates = [2,3,5],
target = 8,
A solution set is:
[
[2,2,2,2],
[2,3,3],
[3,5]
]
给你一个数组(都是正数)和一个目标数,找到所有和为这个数的组合,数组里的数可重复使用
思路:
1.仍然是递归+深度优先搜索,
2.由于所有数都是正数,因此我们可以先将数组升序排,进行加速查找
3.注意条件的处理,元素是可以重复使用的,详细见代码注释
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(candidates, target, 0, cur, ans);
return ans;
}
void dfs(vector<int>& candidates, int target, int start, vector<int>& cur, vector<vector<int> > ans) {
if (target == 0) {//满足条件就放入ans
ans.push_back(cur);
}
for (int i = start; i < candidates.size(); i++) {
if (candidates[i] > target) {//剪枝 为了加速计算
break;
}
cur.push_back(candidates[i]);
dfs(candidates, target-candidates[i],i,cur,ans);//从i开始,因为是可重复使用的
cur.pop_back();//弹出 放下一个可能的数
}
}
};