原题:
Given a set of candidate numbers (
candidates
) (without duplicates) and a target number (target
), find all unique combinations incandidates
where the candidate numbers sums totarget
.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] ]
找出和为目标值的所有组合,数字可以重复但是组合不能重复,想到递归可以很好的传递查找的结果,结果速度还行,但是递归的老问题是存储不行,结果:
Success
Runtime: 8 ms, faster than 98.23% of C++ online submissions for Combination Sum.
Memory Usage: 9.6 MB, less than 63.89% of C++ online submissions for Combination Sum.
class Solution {
public:
vector<vector<int>> re;
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<int> ini;
sort(candidates.begin(),candidates.end());
findsolution(0,candidates.size()-1,target,ini,candidates);
return re;
}
void findsolution(int l,int r,int remain,vector<int>& numlist,vector<int>& nums){
for(int i=l;i<=r;i++){
if(nums[i]<remain){
numlist.push_back(nums[i]);
findsolution(i,r,remain-nums[i],numlist,nums);
numlist.pop_back();
}
else if(nums[i]==remain){
numlist.push_back(nums[i]);
re.push_back(numlist);
numlist.pop_back();
}
else break;
}
}
};
其实改成循环也行,但没必要,有兴趣的可以练习一下