[LeetCode] Combination Sum

Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.

The same repeated number may be chosen from C unlimited number of times.

Note:

  • All numbers (including target) will be positive integers.
  • Elements in a combination (a1, a2, … , ak) must be in non-descending order. (ie, a1a2 ≤ … ≤ ak).
  • The solution set must not contain duplicate combinations.

For example, given candidate set 2,3,6,7 and target 7,
A solution set is:
[7]
[2, 2, 3]

以下是我 AC 的代码:

/**

 * author:Zhou Jianxin

 */



class Solution 

{

public:

    vector<vector<int> > combinationSum(vector<int> &candidates, int target) 

    {

         sort(candidates.begin(), candidates.end());

         vector<vector<int>> ret;

         vector<int> path;

         combinationSumRec(candidates, target, ret, path, 0);

         return ret;

    }

    

private:

    void combinationSumRec(const vector<int> &candidates,

                           int target,

                           vector<vector<int>> &ret,

                           vector<int> &path,

                           size_t index)

    {

        if (target == 0)

        {

            ret.push_back(path);

            return;

        }

        

        int prev = -1;

        

        for (size_t ix = index; ix != candidates.size(); ++ix)

        {

            if (candidates[ix] > target)

            {

                return;

            }

            

            if (candidates[ix] == prev)

            {

                continue;

            }

            

            path.push_back(candidates[ix]);

            combinationSumRec(candidates, target - candidates[ix], ret, path, ix);

            path.erase(path.end() - 1);

            prev = candidates[ix];

        }

    }

};

你可能感兴趣的:(LeetCode)