思路
回溯
先把candidate排个序,这样可以在中途直接cut掉后面的loop
为了避免重复结果,需要传入一个startIndex,在这之前的都不能作为candidate
代码
class Solution { public: void combSumSub(vector<int>& candidates, int target, vector<vector<int>>& results, vector<int> currPath, int candStartIndex){ for(int i=candStartIndex; i<candidates.size(); i++){ if(target - candidates[i] < 0) break; //too big if(target == candidates[i]){ currPath.push_back(candidates[i]); results.push_back(currPath); continue; } currPath.push_back(candidates[i]); combSumSub(candidates, target - candidates[i], results, currPath, i); currPath.erase(currPath.end()-1); } } vector<vector<int>> combinationSum(vector<int>& candidates, int target) { sort(candidates.begin(), candidates.end()); vector<vector<int>> result; combSumSub(candidates, target, result, vector<int>(), 0); return result; } };