看到此题回想到用回溯法枚举可能的状况。ide
class Solution { public: vector<vector<int>> res; vector<vector<int>> combinationSum(vector<int>& candidates, int target) { if(candidates.size()==0) return res; for(int i = 0; i < candidates.size(); i++){ cout<<"value: "<<candidates[i]<<endl; } vector<int> temp; sort(candidates.begin(), candidates.end()); sumcandi(candidates,0,target,temp); // 先排序 sort(res.begin(), res.end()); // 在去重,unique时返回重复元素的其实位置 //好比2 3 3 4 4 // uniqueunique 回处理成2 3 4 3 4 ,返回第一个3的位置 res.erase(unique(res.begin(), res.end()),res.end()); return res; } void sumcandi(vector<int> candidates, int index, int value,vector<int> tmp){ // index 索引。 valuevalue 剩余值。tmp 保存序列 if(index>=candidates.size()) return; if(candidates[index] == value){ tmp.push_back(candidates[index]); res.push_back(tmp); return; } // cout<<"sum: "<<sum<<endl; int sum = value-candidates[index]; cout<<"sum: "<<sum<<endl; if(sum<0) return; tmp.push_back(candidates[index]); sumcandi(candidates,index,sum,tmp); // 对第当前元素重复 sumcandi(candidates,index+1,sum,tmp); // 对下一个元素继续 tmp.pop_back(); // 回溯,弹出vector元素 sumcandi(candidates,index+1,value,tmp); // 对下个元素从新开始,注意剩余值也变了 } };