题目 39. 组合总和 代码 /** * @param {number[]} candidates * @param {number} target * @return {number[][]} */ var combinationSum = function(candidates, target) { let sum = 0; let cur = []; let ans = []; back(0); return ans; //start代表从哪个位置开始抽取 function back(start){ if(sum > target){ return; } //回溯停止的条件 if (sum === target){ ans.push([...cur]); return; } //这道题的精髓就在于通过start来排除组合元素一样的情况 //在进行更深一层回溯的时候,要保证之前的元素不会被选进来 //如果之前的元素被选进来了,那么结果就会出现[2,2,3] [2,3,2]这样的重复 for (let i = start ; i < candidates.length; i++){ cur.push(candidates[i]); sum += candidates[i]; back(i); sum -= candidates[i]; cur.pop(); } } }; /** * @param {number[]} candidates * @param {number} target * @return {number[][]} */ var combinationSum = function(candidates, target) { let sum = 0, tmp = [], ans = []; candidates.sort((a, b) => a - b); //剪枝的话,就必须排序 //因为剪枝的思路是,之后的数全部比现在遍历到的更大 function back(sum, tmp, start){ //base case if(sum > target) return; if(sum === target){ ans.push([...tmp]); return; } for(let i = start; i < candidates.length && sum + candidates[i] <= target; i++){ sum += candidates[i]; tmp.push(candidates[i]); back(sum, tmp, i); tmp.pop(); sum-=candidates[i]; } } back(sum, tmp, 0); return ans; };