题目:(来自LeetCode)
Given aset of candidate numbers (C)(without duplicates) and a target number (T), find all unique combinations inC where the candidate numbers sums toT.
Thesame 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.
举例:
[2, 3, 6, 7], 7 ---> [7], [2, 2, 3]
[1,1, 2, 2,], 5 ---> [1, 1, 1, 1, 1], [1, 2, 2], [1, 1, 1, 2]
思路:
上一次做的题目是数独求解,所以这一次想到的方法就直接是回溯了,首先将数组排序,然后从小端开始,找到≥当前数的下一位数,不断加到一个数组中,知道此数组的元素之和=或者>target为止。
代码:
vector<vector<int>> conb_big;
vector<int> conb;
void combination(vector<int>& candidates,int location,int target)
{
if(target < 0 || location >= candidates.size()) return;
if(target == 0)
{
conb_big.push_back(conb);
return;
}
for(int i = location; i < candidates.size(); i++)
{
conb.push_back(candidates[i]);
combination(candidates,i,target - candidates[i]);
conb.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target)
{
sort(candidates.begin(), candidates.end()); //采用的是从小到大的排序
combination(candidates,0,target);
return conb_big;
}
时间复杂度:
学算法的时候没好好学,导致碰到这样带回溯递归的,并且递归的深度以及解的个数,都和输入的数据有关系的,菜鸡我都不会总结出一个合适的时间复杂度出来。惭愧惭愧。
空间复杂度:
和解的个数有关和每个解得长度有关。。。。。。