leetcode39组合总和

class Solution {
public:
    vector> combinationSum(vector& candidates, int target) {
        vector > ans;
        vector tmp;
        if (candidates.empty()) {
            return ans;
        }
        helper(candidates, target, 0, ans, tmp);
        return ans;
       
    }
private:
     void helper(vector& candidates, int target, int start, vector > &ans, vector &tmp) {
            if (target < 0) {
                return;
            }
            if (target == 0) {
                ans.push_back(tmp);
            }
            // 这里的start的值赋值个i, 决定了开始位置,也就是说,假设start==1, 那么只能取candidate[1]以及以后的数字
            //   start = 0
            //    i 的取值范围 :  [0,1,2,3,4,5]
            //   start = 1
            //    i 的取值范围 :  [1,2,3,4,5]
            //   start = 2
            //    i 的取值范围 :  [2,3,4,5]
            //   start = 3
            //    i 的取值范围 :  [3,4,5]
            //    就这样依次走下去
            // 这就有点相当于  for start == 0 to n:
            //                      for  i == start to n:
            //                           for  j ==  i to n : (下面的注释解释了这一行伪代码)
            for (int i = start; i < candidates.size(); i++) {
                tmp.push_back(candidates[i]);
                // 最重要的一点在这个i上, 这关系到数据是如何被选取的,要考虑为什么不是start, 也不是start+1,也不是i+1
                // start               假设start==0的时候  i的取值范围是[1,2,3,4,5]
                // |   i               现在i移动到了3 那么下一步要怎么进行呢? 题目要求,此时后面的数字的取值范围就是[3,5],                 // |   |                 因为可重复,所以能取到3, 最大的值呢就是5, 所以这里就只能取i
                // 1 2 3 4 5 
                helper(candidates, target - candidates[i], i , ans, tmp);
                tmp.pop_back();
            }
        }
};

你可能感兴趣的:(leetcode39组合总和)