思路
简单的backtracking。在回溯步骤中,通过参数cur记录已经遍历过的元素。
对于停止条件,起初只想到通过累加获得和(原始代码)。通过减法设置停止条件效率更高(优化代码)。
代码
原始代码
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
if (candidates.empty()) return {};
sort(candidates.begin(), candidates.end());
vector<vector<int>> rs;
addCombination(rs, candidates, {}, target, 0);
return rs;
}
void addCombination(vector<vector<int>> &rs, vector<int> &candidates, vector<int> combination, int &target, int cur) {
if (cur == candidates.size()) return ;
int total = 0;
for (const auto &i : combination) {
total += i;
}
if (total == target) {
rs.push_back(combination);
return ;
}
if (total > target) return ;
for (int i = cur; i < candidates.size(); ++i) {
combination.push_back(candidates[i]);
addCombination(rs, candidates, combination, target, i);
combination.pop_back();
}
}
};
优化代码
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
if (candidates.empty()) return {};
sort(candidates.begin(), candidates.end());
vector<vector<int>> rs;
vector<int> combination;
addCombination(rs, candidates, combination, target, 0);
return rs;
}
void addCombination(vector<vector<int>> &rs, vector<int> &candidates, vector<int> &combination, int target, int cur) {
if (!target) {
rs.push_back(combination);
return ;
}
for (int i = cur; i < candidates.size() && candidates[i] <= target; ++i) {
combination.push_back(candidates[i]);
addCombination(rs, candidates, combination, target - candidates[i], i);
combination.pop_back();
}
}
};