lintcode-数字组合II

作者: 鬼谷神奇 | 来源:发表于2016-03-14 10:57 被阅读195次

    题目:给出一组候选数字(C)和目标数字(T),找出C中所有的组合,使组合中数字的和为T。C中每个数字在每个组合中只能使用一次
    类型:回溯
    地址:http://www.lintcode.com/zh-cn/problem/combination-sum-ii/

    注意事项

    • 所有的数字(包括目标数字)均为正整数。
    • 元素组合(a1, a2, … , ak)必须是非降序(ie, a1 ≤ a2 ≤ … ≤ ak)。
    • 解集不能包含重复的组合。

    代码实现:

    class Solution {
    public:
        /**
         * @param num: Given the candidate numbers
         * @param target: Given the target number
         * @return: All the combinations that sum to target
         */
         
        vector<vector<int> > result;
        vector<int> tmp;
        
        void combinationSum(vector<int> &num, int target)
        {
            // 当没有元素或目标和为负或0时,终止(因为所有元素为正整数)
            if(num.size() == 0  || target <= 0)  //注意剪枝
                return;
            
            //找到一组解
            if(num[0] == target)
            {
                tmp.push_back(num[0]);
                
                result.push_back(tmp);
                
                tmp.pop_back();
            }
            
            
        vector<int> B;
            B.assign(num.begin()+1, num.end());
            
            tmp.push_back(num[0]);
            combinationSum(B, target-num[0]);
            tmp.pop_back();
            
            combinationSum(B, target);
        }
         
        vector<vector<int> > combinationSum2(vector<int> &num, int target) {
            // write your code here
            sort(num.begin(), num.end());
            combinationSum(num, target);
           
            // 删除重复元素
            sort(result.begin(), result.end());
            result.erase(unique(result.begin(), result.end()), result.end());
            
            return result;
            
            
        }
    };
    

    相关文章

      网友评论

        本文标题:lintcode-数字组合II

        本文链接:https://www.haomeiwen.com/subject/tdsflttx.html