39. 组合总和 - 自己发明的解法和官方解法比较分析
39. 组合总和
https://leetcode-cn.com/problems/combination-sum/
拿到题比较贪心,希望用比较简洁的方法想出来,不要太高的复杂度。隐隐约约记得好像这种题应该是用回溯搜索来写,但是刚刚拿题的时候居然没想出来。。。晚上洗完衣服,灵光乍现,一气呵成。
class Solution {
private:
int size = 0;
void tb(vector<int>& candidates, int target,
vector<vector<int>> &ans, vector<int> &path, int stPos){
for(int i = stPos; i < size; i++){
if(target - candidates[i] > 0){
path.push_back(candidates[i]);
tb(candidates, target - candidates[i], ans, path, i);
path.pop_back();
}
else if(target == candidates[i]){
path.push_back(candidates[i]);
ans.push_back(path);
path.pop_back();
}
else break;
}
}
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
sort(candidates.begin(), candidates.end());
size = candidates.size();
vector<vector<int>> ans;
vector<int> path;
tb(candidates, target, ans, path, 0);
return ans;
}
};
因为1 <= candidates.length <= 30,我们先对candidates排序,这样就可以减去很多无用的枝条。
官方题解是用的emplace_back来代替push_back,据说可以减少一个复制的时间。以后写代码要注意使用。

浙公网安备 33010602011771号