Description:
Given a set of candidate numbers (C) (without duplicates) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
- All numbers (including target) will be positive integers.
- The solution set must not contain duplicate combinations.
For example, given candidate set [2, 3, 6, 7]
and target 7
,
A solution set is:
[ [7], [2, 2, 3] ]——————————————————————————————————————————————————————————————————————————
Solution:
迭代问题,类似要求任意组合1,5,10,20,50等面值的钱以凑成100或一定额度的钱这样的应用问题。思路:
1.将输入数组排序,进入迭代函数findEveryCombination()(即2)
2.判断target是否等于0,若是则将局部vector combination 压入全局vector result,若不是则返回3
3.判断target是否大于0,若是则返回4,若不是则返回上一层迭代(即前面相加的数值已经大于target)
4.遍历输入数组,将当前元素压入combination;进入迭代(即2)同时target-当前元素;弹出combination
5.返回result
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> result;
if (candidates.size() > 0) {
sort(candidates.begin(), candidates.end());
vector<int> combination;
findEveryCombination(candidates, 0, target, combination, result);
}
return result;
}
void findEveryCombination(vector<int> candidates, int index, int target,
vector<int> combination, vector<vector<int>>& result) {
// cout << "index: " << index << " target: " << target << endl;
// for (int j = 0; j < combination.size(); j++) cout << combination[j] << " "; cout << endl;
if (index >= candidates.size())
return;
if (target == 0){
result.push_back(combination);
} else if (target > 0){
for (int i = index; i < candidates.size(); i++) {
combination.push_back(candidates[i]);
findEveryCombination(candidates, i, target - candidates[i], combination, result);
combination.pop_back();
}
}
}
};