LintCode-数字组合 II

给出一组候选数字(C)和目标数字(T),找出C中所有的组合,使组合中数字的和为T。C中每个数字在每个组合中只能使用一次。

样例

给出一个例子,候选数字集合为[10,1,6,7,2,1,5] 和目标数字 8,

解集为:[[1,7],[1,2,5],[2,6],[1,1,6]]

注意
  • 所有的数字(包括目标数字)均为正整数。
  • 元素组合(a1a2, … , 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> > combinationSum2(vector<int> &num, int target) {
        // write your code here
        set<vector<int> > r;
        vector<int> cur;
        sort(num.begin(),num.end());
        combination(cur,num,0,0,target,r);
        vector<vector<int> > ret;
        copy(r.begin(),r.end(),back_inserter(ret));
        return ret;
    }
    void combination(vector<int> cur,vector<int> &num,int index,int curSum,int target,set<vector<int> >&ret)
    {
        if(curSum>target)
            return;
        if(curSum==target)
        {
            ret.insert(cur);
            return;
        }
        if(index==num.size())
            return;
        combination(cur,num,index+1,curSum,target,ret);
        cur.push_back(num[index]);
        combination(cur,num,index+1,curSum+num[index],target,ret);
    }
};


你可能感兴趣的:(面试,lintcode)