一遇到这种回溯递归的,感觉脑子就成了浆糊~~
第一点:对于不合格的元素直接返回,不在结果向量里添加任何东西,有了返回便继续下面的循环
第二点:对于某些元素可以重复无数次--采用办法下次递归的元素仍从接着上个元素。
for(int j=index[n];j<candidates.size()&&(target>=candidates[j]);j++)
{
index[n+1]=j;
class Solution { private: vector<vector<int>> res; const int index_count=10000; public: void findSet(int sum,vector<int>& candidates,int target,int index[],int n ) { if(sum>target) return; if(sum==target) { vector<int> result; for(int i=1;i<=n;i++) { result.push_back(candidates[index[i]]); } res.push_back(result); return; } for(int j=index[n];j<candidates.size()&&(target>=candidates[j]);j++) { index[n+1]=j; findSet(sum+candidates[j],candidates,target,index,n+1); } } vector<vector<int>> combinationSum(vector<int>& candidates, int target) { sort(candidates.begin(),candidates.end()); int *index=new int [index_count]; memset(index,0,sizeof(int)*index_count); res.clear(); findSet(0,candidates,target,index,0);delete[] index; return res; } };