lintcode----k数和II

题目描述:
Your title here…Given n unique integers, number k (1<=k<=n) and target.

样例:
给出[1,2,3,4],k=2, target=5,返回 [[1,4],[2,3]]

思路讲解:
我的思路就是利用深度搜索,首先我们明确我们深搜是怎么搜,我们由于我们是固定的数组,所以我们只需要考虑对于每一位置的数拿或者不拿,这两种情况,所以每次递归我们就是对这样两种情况进行操作,明确了递归的内容,我们就需要明确递归的出口了,递归的出口就是我们挑的个数等于要求的个数,还有就是挑的数的总和等于指定的和,这两种情况都满足的情况下,就可以说明我们找到了一组,还有就是我们需要剪枝,即挑的个数大于要求的个数,还有就是挑的数的总和大于指定的和时,我们就不哟啊往下判断因为其已经不满足要求了。

代码详解:

class Solution {
public:
    /*
     * @param A: an integer array
     * @param k: a postive integer <= length(A)
     * @param targer: an integer
     * @return: A list of lists of integer
     */
    vector<vector<int>> kSumII(vector<int> &A, int k, int targer) {
        // write your code here

        vector<string>vec;
        string s="";
        ksum(A,vec,s,0,0,k,targer,0);

        vector<string>tmp;
        vector<vector<int>>res(vec.size());
        for(int i=0;i<vec.size();i++){
            tmp=split(vec[i],"-");
            vector<int>vec_tmp;
            for(int j=0;j<tmp.size();j++){
                int str2int=atoi(tmp[j].c_str());
                res[i].push_back(str2int);
            }
        }
        return res;

    }

    void ksum(vector<int>A,vector<string>&res,string &s,int index,int count,int k,int target,int sum){

        if(index<=A.size()){
            if(count==k&&sum==target){
                cout<<"str is "<<s<<endl;
                res.push_back(s);
                return ;
            }else if(count>k||target<sum){
                return ;
            }

            for(int i=0;i<2;i++){
                if(i==0){
                    int tmp=sum+A[index];
                    string ss=s+to_string(A[index])+"-";
                    ksum(A,res,ss,index+1,count+1,k,target,tmp);
                }else{
                    ksum(A,res,s,index+1,count,k,target,sum);
                }
            }
        }
    }

    void print_vector_str(vector<string>res){
        for(int i=0;i<res.size();i++){
            cout<<res[i]<<"  ";
        }
        cout<<endl;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值