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();//弹出 放下一个可能的数 } } };