我试图解决一个编码难题“组合和”(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));

最佳答案

这种技术叫做回溯。
回溯是一种用于逐步建立问题解决方案的技术这些“部分解”可以用一系列决定来表达。一旦确定“部分解”不可行(即没有后续决策可以将其转换为解决方案),则回溯算法将其步骤返回到最后一个可行的“部分解”并重试。
这里的关键点是,在currArr.push(候选者[i])之后,流是递归调用innerFunction(currArr,newTarget,i);因此currArr不断增长,在某个点上,如果(target==0)找到了所需的结果,并且使用currArr.slice()和return对currArr进行深度复制代码返回currArr.pop()一步,因为这是在innerFunction递归调用之后。
我希望这能帮助你-)

10-05 23:22