Link:https://leetcode.com/problems/combination-sum/

    1. /**
    2. * @param {number[]} candidates
    3. * @param {number} target
    4. * @return {number[][]}
    5. */
    6. var combinationSum = function(candidates, target) {
    7. let rst = [], local = [];
    8. backtrack(rst, local, candidates, target);
    9. return rst;
    10. };
    11. function backtrack(rst, local, candidates, target) {
    12. if(equal(local, target) && !judgeArrEqual(rst, local)) rst.push(local);
    13. else {
    14. for(let i=0; i<candidates.length; i++) {
    15. local.push(candidates[i]);
    16. let nextLocal = local.slice(0);
    17. if(constraint(local, target)) {
    18. backtrack(rst, nextLocal, candidates, target);
    19. }
    20. local.pop();
    21. }
    22. }
    23. }
    24. function judgeArrEqual(arr, arr2) {
    25. let ar2 = arr2.slice(0).sort();
    26. return arr.some(ele => {
    27. let ar1 = ele.slice(0).sort();
    28. if(ar1.toString() === ar2.toString()) return true;
    29. });
    30. }
    31. function equal(arr, target) {
    32. let sum =0;
    33. if(arr.length !== 0) {
    34. sum = arr.reduce((acc, cur) => (acc+cur));
    35. }
    36. if(sum === target) return true;
    37. else return false;
    38. }
    39. function constraint(arr, target) {
    40. let sum =0;
    41. if(arr.length !== 0) {
    42. sum = arr.reduce((acc, cur) => (acc+cur));
    43. }
    44. if(sum > target) return false;
    45. else return true;
    46. }