数字组合

这次用到的算法是著名的回溯法,八皇后问题的解决就靠的是这种方法,这种函数传入的参数一定有引用,还有上下联系的传递信息,比如这里的curSum,当前总数,当然还有一些参数是一直不变的,比如target。

该函数的过程就是首先一开始一定要有递归结束的条件判断,然后调用自己,从小到大开始,增加栈帧,直到退出调用;然后开始从大数到小数递归推进,遇到合适的insert进set中,超出的就停止调用,回退到原来最近的满足点。

这个回退链就是由两个递归调用中间存在一个“实质性的操作”产生的。

C++代码:

#include<iostream>
#include<vector>
#include<fstream>
#include<cstdlib>
#include<set>
#include<algorithm>
using namespace std;

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){
            cout<<"curSum>target:"<<curSum<<endl;
            return;
        }

        if(curSum==target)
        {
            for(auto i : cur) {
                cout<<i<<",";
            }
            cout<<endl;
            ret.insert(cur);
            return;
        }
        if(index==num.size()) {
            //cout<<"current index:"<<index<<endl;
            return;
        }

        combination(cur,num,index+1,curSum,target,ret);
        cout<<"num[index]"<<num[index]<<endl;
        cur.push_back(num[index]);
       // cur.push_back(num[index]);
        combination(cur,num,index+1,curSum+num[index],target,ret);

        combination(cur,num,index,curSum+num[index],target,ret);
    }
};

int main(){
    vector<int> a{2,3,5,7};
    Solution sol;
    sol.combinationSum2(a,7);
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值