组合和编码挑战

时间:2018-05-19 23:29:19

标签: javascript algorithm

我正在尝试解决编码挑战“组合总和”(https://leetcode.com/problems/combination-sum/discuss/127208/Simple-Javascript-Solution)并找到了解决方案,但我无法理解为什么currArr.pop()if (target >= candidates[i])是必需的。我试图理解通过删除它并替换它但仍然无法弄明白。有人可以解释为什么这对我来说是必要的吗?谢谢!

var combinationSum = function(candidates, target) {
  candidates.sort((a,b) => a - b);
  const results = [];


  const innerFunction = (currArr, target, index) => {
    
    if (target === 0) {
      results.push(currArr.slice());
      return;
    }

    for (let i = index; i < candidates.length; i++) {

      if (target >= candidates[i]) {
        
        const newTarget = target - candidates[i];
        currArr.push(candidates[i]);
        innerFunction(currArr, newTarget, i);
        currArr.pop();
      
      } else {

        return;

      }
    }

  }


  innerFunction([], target, 0);
  return results;
};

console.log(combinationSum([2,3,6,7], 7));

1 个答案:

答案 0 :(得分:1)

这种技术称为回溯。 回溯是一种用于逐步建立问题解决方案的技术。这些&#34;部分解决方案&#34;可以用一系列决定来表达。一旦确定一个&#34;部分解决方案&#34;是不可行的(即后续决定不能将其转换为解决方案)然后回溯算法将其步骤回溯到最后可行的部分解决方案&#34;再试一次。

这里的关键点是在currArr.push(candidate [i])之后流是recurcion调用innerFunction(currArr,newTarget,i);所以currArr不断增长,在某些时候,如果(目标=== 0)找到了所需的结果,你用currArr.slice()对你的currArr进行深度复制,现在返回,代码又回到了currArr.pop( )因为这是在innerFunction递归调用之后发生的。

我希望这可以帮助你 - )

相关问题