题目描述:
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;
}
};