[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];
        }
    }
};
posted @ 2014-12-28 12:30  Acjx  阅读(418)  评论(0编辑  收藏  举报