力扣-39-组合总和

直达链接

跟以往的回溯不太一样的是:

  1. 这里的出口条件不再是数组长度,而是数组元素和
  2. 参数数组中的元素可以被无限制重复选取
class Solution {
public:

    void backtrack(vector<vector<int>>& ret, vector<int>& candidates, int target, int sum,vector<int>& cur,int prev) {
        
        
        if (sum == target) {
            ret.push_back(cur);
        }
        else if (sum > target) {
            return;
        }
        else {
            for (int i = 0; i < candidates.size(); ++i) {
                // prev字段主要是为了确保结果数组中都是递增的,以此达到去重的目的
                if (candidates[i] >= prev) {
                    cur.push_back(candidates[i]);
                    sum += candidates[i];
                    backtrack(ret, candidates, target, sum, cur, candidates[i]);
                    sum -= candidates[i];
                    cur.pop_back();
                }
            }
        }
    }



    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<vector<int>> ret;
        vector<int> cur;
        backtrack(ret, candidates, target, 0, cur,0);
        return ret;
    }
};

回溯方法定义了很多的参数,总觉得不够优雅

accumulate()函数(包含numeric头文件),效果显著 ?!

    void backtrack(vector<vector<int>>& ret, vector<int>& candidates, int target,vector<int>& cur,int prev) {
        
        int sum = accumulate(cur.begin(), cur.end(), 0);
        
        if (sum == target) {
            ret.push_back(cur);
        }
        else if (sum > target) {
            return;
        }
        else {
            for (int i = 0; i < candidates.size(); ++i) {
                // prev表示上一个插入cur的元素,这里希望能够使结果数组是(包含重复元素)递增的,以此达到去重的目的
                if (candidates[i] >= prev) {
                    cur.push_back(candidates[i]);
                    backtrack(ret, candidates, target, cur, candidates[i]);
                    cur.pop_back();
                }
            }
        }
    }

    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<vector<int>> ret;
        vector<int> cur;
        backtrack(ret, candidates, target, cur,0);
        return ret;
    }

posted @ 2022-08-08 15:44  YaosGHC  阅读(34)  评论(0)    收藏  举报