问题描述:
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]
]
题意就是提供一个向量和目标值target,判断向量中能组成target的对并且输出,向量的元素可以使用多次。
解题思路:
深度优先遍历的方法,遍历函数为combine(vector<int>& candidates, int target, int index, vector<vector<int>>& result, vector<int> tmp),参数的意思分别是原向量,目标值,当前遍历的索引,结果向量,当前判断的向量。
源码:
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> result;
// result.clear();
vector<int> tmp;
combine(candidates, target, 0, result, tmp);
return result;
}
void combine(vector<int>& array, int target, int index, vector<vector<int>>& result, vector<int> tmp){
if(target<0)
return;
else if(target==0){
result.push_back(tmp);
}
else{
for(int i=index; i<array.size(); i++){
tmp.push_back(array[i]);
// cout<<target<<" "<<array[i]<<endl;
combine(array, target-array[i], i, result, tmp);
tmp.pop_back();
}
}
}
};
改进的方法:
上面的做法时间复杂度很高,可以先给向量排序,然后再在深度搜索的时候多加一个条件target>=candidates[i]。从而大大的降低了时间复杂度。源码如下:
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
sort(candidates.begin(), candidates.end());
vector<vector<int>> result;
// result.clear();
vector<int> tmp;
combine(candidates, target, 0, result, tmp);
return result;
}
void combine(vector<int>& candidates, int target, int index, vector<vector<int>>& result, vector<int> tmp){
if(!target){
result.push_back(tmp);
return;
}
else{
for(int i=index; i != candidates.size() && target>=candidates[i]; i++){
tmp.push_back(candidates[i]);
// cout<<target<<" "<<array[i]<<" "<<i<<endl;
combine(candidates, target-candidates[i], i, result, tmp);
tmp.pop_back();
}
}
}
};