leetcode37.组合数组中的数成目标值(可重复)

思路:回溯法,可进可退,多次寻找合适的值。需要输出多个解,每个解由一个动态数组构成。从第一个值开始,先将一个数组的值压入一个数组,同时将目标值减少进入数组的这个值,继续条用,停止条件是当此时的进入目标值=0,此时就将整个数组压入结果得二维数组中去,循环调用的停止条件是当candidates【i】得这个数不是最后一个(因为判断目标为0了没有的那个数在下一次循环之前)可以先判断减去这个之后是否为0。总结:回溯法,适合于动态进退,回(体现在还是会将上一个数弹出,用另一个数组来保存结果)!!!调用本函数多次,每一次都有条件判断,不适合爬楼梯那题class Solution {

public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) 
    {
        sort(candidates.begin(), candidates.end());
        vector<vector<int>> res;
        vector<int> combination;
        method(candidates,target, res, combination,0);
        return res;
    }
    
private:
    void method(vector<int>& candidates, int target, vector<vector<int>> &res,  vector<int> combination,int begin)
    {                                                       //错误,res没有用引用,而是直接重建,所以错误!直接返回0!
        if(!target){
            res.push_back(combination);
            return ;
        }
        
        for(int i=begin; i!=candidates.size()&& target>=candidates[i]; ++i )       //每次都是从i开始,可以多个重复的一起进去,回溯法 
        {
            combination.push_back(candidates[i]);
            method(candidates, target-candidates[i], res, combination, i);
            combination.pop_back();
        }
        return ;
    }
    
};

你可能感兴趣的:(leetcode)