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,据说可以减少一个复制的时间。以后写代码要注意使用。

posted @ 2021-11-01 22:30  柚子z  阅读(30)  评论(0)    收藏  举报