zoukankan      html  css  js  c++  java
  • [LeetCode] Combination Sum II

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

    Each number in C may only be used once in the combination.

    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 10,1,2,7,6,1,5 and target 8,
    A solution set is:
    [1, 7]
    [1, 2, 5]
    [2, 6]
    [1, 1, 6]

    以下是我 AC 的代码:

    /**
     * author: Zhou J
     */
    class Solution 
    {
    public:
        vector<vector<int> > combinationSum2(vector<int> &num, int target) 
        {
            sort(num.begin(), num.end());
            vector<vector<int>> ret;
            vector<int> path;
            combinationSum2Rec(num, target, ret, path, 0);
            return ret;
        }
        
    private:
        void combinationSum2Rec(const vector<int> &num,
                                const int target,
                                vector<vector<int>> &ret,
                                vector<int> &path,
                                size_t pos)
        {
            if (target == 0)
            {
                ret.push_back(path);
                return;
            }
            
            // Mark the previous one
            int prev = -1;
            
            for (size_t ix = pos; ix != num.size(); ++ix)
            {
                if (num[ix] > target)
                {
                    break;
                }
                
                if (prev == num[ix])
                {
                    continue;
                }
                
                path.push_back(num[ix]);
                combinationSum2Rec(num, target - num[ix], ret, path, ix + 1);
                // Backtracing. Note that we should sort the vector before we use the skill of backtracing.
                path.erase(path.end() - 1);
                // The one which we have pushed just now. 
                prev = num[ix];
            }
        }
    };
  • 相关阅读:
    【转】 cin、cin.get()、cin.getline()、getline()、gets()等函数的用法
    HDU How many prime numbers
    《大学ACM的总结 》(转载)
    POJ 最小公倍数
    HDU 开门人和关门人
    HDU shǎ崽 OrOrOrOrz
    HDU Saving HDU 2111
    HDU 1106 排序
    strtok函数()
    HDU 2187汶川地震
  • 原文地址:https://www.cnblogs.com/jianxinzhou/p/4190376.html
Copyright © 2011-2022 走看看