LINTCODE——数字组合,数字组合II

LINTCODE——数字组合,数字组合II

说明:两题都是采用回溯法解决问题,只是回溯条件和最后数值处理方法略有不同;

数字组合:由于每个数字都可以重复使用,所以把回溯情况分为两种:一是取当前值;二是把当前值去掉,取下一个值;

class Solution {
public:
    /*
     * @param candidates: A list of integers
     * @param target: An integer
     * @return: A list of lists of integers
     */
    vector<vector<int>> combinationSum(vector<int> &candidates, int target) {
        // write your code here

        vector<vector<int> >  res ;
        vector<int> restemp;
        //排序
        sort(candidates.begin(),candidates.end());

        restemp.push_back(candidates[0]);
        comb(res,restemp,candidates,0,target, candidates[0]);

        return res;
    }

    void comb(vector<vector<int> > &res , vector<int> restemp, vector<int> &num, int index , const int &target ,int sum)
    {
        if(sum == target)
        {
            res.push_back(restemp);
            return;
        }
        if(sum > target)
            return ;
        //要不取当前INDEX,要不不取当前(删除当前),取后一个,即INDEX+1

        if(index < num.size())
        {    

             restemp.push_back(num[index]);
             comb(res , restemp, num , index ,target ,sum +num[index] );

        }
        if(index + 1 < num.size())
        {

            //删除当前取后一个操作
            restemp.erase(restemp.end()-1);
            restemp[restemp.size()-1] = num[index+1];
            sum -=  num[index];
            comb(res , restemp, num , index+1 ,target , sum + num[index+1]);

        }


    }
};

数字组合II:
每个数值只能取一个,直接回溯选择取当前或者不取当前就可以了,在有重复数字的情况下,需注意的情况是:当num为{1,1,3,7,8,9},target = 8,这个时候如果用双容器型采值,则会出现两个[1,7],[1,7],所以代码当中先用set

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是为了防止出现重复解;

        set<vector<int> >  res ;
        vector<int> restemp;
        //排序
        sort(num.begin(),num.end());
        comb(res,restemp,num,0,target, 0);

        vector<vector<int> >ret(res.begin(),res.end());
        return ret;


    }

    void comb(set<vector<int> > &res , vector<int> restemp, vector<int> &num, int index , const int &target ,int sum)
    {
        if(sum == target)
        {
            res.insert(restemp);
            return;
        }
        if(sum > target)
            return ;

        if(index < num.size())
        //由于每个只取一次,则是简单的取或者不取问题
        {
            comb(res , restemp, num , index + 1 ,target ,sum );
            restemp.push_back(num[index]);
            comb(res , restemp, num , index+1 ,target , sum + num[index]);
        }
    }
};
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值