题目
代码(首刷自解)
如同窜稀般顺畅,一气呵成通过,简简单单,当年打蓝桥杯的实例还是在的哈哈哈。
class Solution {
public:
vector<vector<int>> ans;
vector<int> track;
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
sort(candidates.begin(), candidates.end());
backtrack(candidates, 0, 0, target);
return ans;
}
void backtrack(vector<int>& candidates, int start, int sum, int target) {
if(sum == target) {
ans.push_back(track);
return;
}
for(int i = start; i < candidates.size(); i++) {
if(sum + candidates[i] > target) { // 因为是递增,所以如果此刻超了可以直接返回了
return;
}
sum += candidates[i];
track.push_back(candidates[i]);
backtrack(candidates, i, sum, target);
sum -= candidates[i];
track.pop_back();
}
}
};
代码(9.21 二刷自解)
class Solution {
public:
vector<vector<int>> res;
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
sort(candidates.begin(), candidates.end());
vector<int> tmp;
backtrack(candidates, tmp, target, 0);
return res;
}
void backtrack(vector<int>& nums, vector<int>& tmp, int target, int k) {
if(target == 0) {
res.emplace_back(tmp);
return;
}
for(int i = k; i < nums.size(); i++) {
if(target-nums[i] < 0)
break;
tmp.emplace_back(nums[i]);
backtrack(nums, tmp, target-nums[i], i);
tmp.pop_back();
}
}
};