首页 > 其他 > 详细

LeetCode CombinationSum II

时间:2014-03-18 12:11:16      阅读:410      评论:0      收藏:0      [点我收藏+]
bubuko.com,布布扣
class Solution {
public:
    vector<vector<int> > combinationSum2(vector<int> &num, int target) {
        sort(num.begin(), num.end());
        
        vector<vector<int> > tmp;
        vector<int> sel;
        dfs(num, 0, target, sel, tmp);
        return tmp;
    }
    
    void dfs(vector<int> &num, int pos, int target, vector<int>& sel, vector<vector<int> >& res) {
        if (target == 0) {
            res.push_back(sel);
            return;
        }
        if (pos >= num.size()) return;
        int cur = num[pos];
        int dup = 0;        
        int i = pos;
        while (++i < num.size() && num[i] == cur) dup++;
        
        int add = 0;

        for (i = 0; (i <= dup + 1) && add <= target; i++, add+=cur) {
            if (i != 0) {
                sel.push_back(cur);
            }
            dfs(num, pos + dup + 1, target - add, sel, res);
        }
        for (i = add/cur - 1; i>0; i--) sel.pop_back();
    }
    
};
bubuko.com,布布扣

类似01背包,不过这是求和,虽然说每个元素最多用一次,但是从例子中发现,所给的候选数时会有重复的。因为输出要求不能有重复,这时我们可以把多个重复的候选数看成是同一个数取[0, k]次(k为该数出现的次数)这和最初的CombinationSum中类似(只不过这里指定了每个元素出现的次数,而不是原先的可以取无限次),这相当于把重复的候选数压到了一个位置上,当我们在该位置做出取(一次性取n,n<=k)和不取两种选择后,后面再也不会对该数考虑相同的问题,这使得我们可以避免输出雷同解。

LeetCode CombinationSum II,布布扣,bubuko.com

LeetCode CombinationSum II

原文:http://www.cnblogs.com/lailailai/p/3606148.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!