题目

找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
只使用数字1到9
每个数字 最多使用一次
返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。

思路

在上一个组合题上进一步用sum去判断终止条件
同时有双重剪枝技巧。见代码
image.png

  1. var combinationSum3 = function(k, n) {
  2. let res =[];
  3. let path =[];
  4. const backTracing =function(k,n,startindex,sum){
  5. // 回溯循环(这里是横向循环,i的剪枝看k)
  6. for(let i =startindex;i<=9-(k-path.length)+1;i++){
  7. if(sum>n)return; //剪枝2,利用sum
  8. if(path.length===k&&sum===n){
  9. // console.log(sum);
  10. res.push(path.slice());
  11. // console.log(res);
  12. return;
  13. }
  14. sum+=i;
  15. // console.log(sum);
  16. path.push(i);
  17. backTracing(k,n,i+1,sum);
  18. path.pop();
  19. sum-=i; //sum也要回溯
  20. //或者直接传入 sum+i
  21. //backTracing(k,n,i+1, sum+i);
  22. }
  23. }
  24. backTracing(k,n,1,0);
  25. return res;
  26. };