看到此題回想到用回溯法枚舉可能的狀況。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); // 對下個元素從新開始,注意剩餘值也變了 } };