LeetCode 039 Combination Sum

给你一个没有排序的序列和一个target,求出序列的和的值为target,允许序列中选择的值可以重复。

直接用递归。由于需要答案有序,所以先把序列排序,然后再递归的时候不能选择比上一次小的值,可以避免重复的计算。

其中不要随便运用vector<int>uu中的uu.size()-1这个数,会出错的,当uu.size()为0的时候。

class Solution {
public:
    
    void get_ans(int ans,vector<int>& nums,vector<vector<int>>&an,vector<int> get_ss,int limit){
        if(ans==0){an.push_back(get_ss);return ;}
        for(int ii=0;ii<nums.size();ii++){
            if(ans-nums[ii]<0||ii<limit)continue;
            get_ss.push_back(nums[ii]);
            get_ans(ans-nums[ii],nums,an,get_ss,ii);
            get_ss.erase(get_ss.end()-1);
        }
    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        for(int ii=0;ii<candidates.size();ii++){
            if(ii&&candidates[ii]==candidates[ii-1])candidates.erase(candidates.begin()+ii);
        }
        vector<vector<int>>yy;
        vector<int>uu;
        get_ans(target,candidates,yy,uu,0);
        return yy;
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值