这种写法的结果里会有重复的组合:
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
void trackback(vector<int>& candidates, int target, int start){
if( target < 0 )return;
if( target == 0 )res.push_back(path);
for( int i = start; i < candidates.size(); i ++){
path.push_back(candidates[i]);
trackback(candidates, target - candidates[i], start);
path.pop_back();
}
return;
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
trackback(candidates, target, 0);
return res;
}
};
检查代码,发现这一步有误:
结果就正确:
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
void trackback(vector<int>& candidates, int target, int start){
if( target < 0 )return;
if( target == 0 ){
res.push_back(path);
return;
}
for( int i = start; i < candidates.size(); i ++){
path.push_back(candidates[i]);
trackback(candidates, target - candidates[i], i);
path.pop_back();
}
return;
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
trackback(candidates, target, 0);
return res;
}
};
题解里 成功的解法:(个人觉得没有上述的解法直观)
class Solution {
public:
vector<vector<int>> res;
vector<int> path;
void trackback(vector<int>& candidates, int target, int start){
if(start == candidates.size())return;
if( target == 0 ){
res.push_back(path);
return;
}
trackback(candidates, target, start + 1);
if( (target - candidates[start]) >= 0 ){
path.push_back(candidates[start]);
trackback(candidates, target - candidates[start], start);
path.pop_back();
}
return;
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
trackback(candidates, target, 0);
return res;
}
};