Description
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]
]
Solution 1(C++)
class Solution {
public:
void helper(vector<vector<int>> &res, vector<int> &candidates, int index, vector<int> cur, int target) {
if(target == 0) {res.push_back(cur); return;}
if(target < 0) return;
for(int i=index; i < candidates.size(); i++) {
cur.push_back(candidates[i]);
helper(res, candidates, i, cur, target-candidates[i]);
cur.pop_back();
}
return;
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> res;
vector<int> cur;
helper(res, candidates, 0, cur, target);
return res;
}
};
Solution 2(C++)
static int x = [](){std::ios::sync_with_stdio(false);cin.tie(NULL);return 0;}();
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> res;
sort(candidates.begin(), candidates.end());
if(candidates.empty() || target < candidates[0])
return res;
vector<int> com;
findcom(candidates, target, res, com, 0);
return res;
}
void findcom(vector<int>& candidates, int target, vector<vector<int>>& res, vector<int>& com, int begin)
{
if(!target)
res.push_back(com);
for (int i = begin; i != candidates.size() && target >= candidates[i]; ++i){
com.push_back(candidates[i]);
findcom(candidates, target - candidates[i], res, com, i);
com.pop_back();
}
}
};
算法分析
这道题用回溯的方法做,其实不难。有意思的就是解法一比解法二慢了很多。然而解法一与解法二之间的主要差别就是在解法二限制了前寻的深度,而解法一没有,所以这导致解法二回溯更快。
还有就是要注意,前寻的时候,可以找重复的值,但不能在数组中回头找,这一点是要注意的。
程序分析
略。