Javascript Leetcode上的组合SumⅢ

Javascript Leetcode上的组合SumⅢ,javascript,arrays,algorithm,slice,Javascript,Arrays,Algorithm,Slice,leetcode的问题是: 考虑到只能使用1到9之间的数字,并且每个组合都应该是一组唯一的数字,找出k个数字加起来等于n的所有可能组合 例1: 输入:k=3,n=7 输出: [[1,2,4]] 例2: 输入:k=3,n=9 输出: [1,2,6],[1,3,5],[2,3,4]] 我用Javascript找到了一个解决方案 var combinationSum3 = function(k, n) { var result = []; search(1, [], k, n); retu

leetcode的问题是:

考虑到只能使用1到9之间的数字,并且每个组合都应该是一组唯一的数字,找出k个数字加起来等于n的所有可能组合

例1:

输入:k=3,n=7

输出:

[[1,2,4]]

例2:

输入:k=3,n=9

输出:

[1,2,6],[1,3,5],[2,3,4]]

我用Javascript找到了一个解决方案

var combinationSum3 = function(k, n) {
  var result = [];
  search(1, [], k, n);
  return result;

  function search(from, prefix, k, n) {
    if (k === 0 && n === 0) return result.push(prefix);
    if (from > 9) return;
    prefix.push(from);
    search(from + 1, prefix.slice(0), k - 1, n - from);
    prefix.pop();
    search(from + 1, prefix.slice(0), k, n);
  }
};

我假设slice(0)方法返回原始数组的副本,所以我尝试用prefix替换prefix.slice(0)。然而,我得到的结果是[]。这里的问题是什么

这是一个参考问题。如果使用slice,则会获得阵列的副本。如果仅使用
前缀
,则所有后续操作(如push或pop)都会影响阵列

如果您不喜欢使用副本,可以使用concat,它也提供了一个新数组,但可以使用新项

您的代码如下所示:

var组合sum3=函数(k,n){
var结果=[];
搜索(1,[],k,n);
返回结果;
函数搜索(from、前缀、k、n){
if(k==0&&n==0)返回result.push(前缀);
如果(从>9)返回;
搜索(from+1,前缀.concat(from),k-1,n-from);
搜索(从+1开始,前缀为k,n);
}
};
console.log(组合sum3(3,7));
console.log(组合sum3(3,9));

控制台日志(组合SUM3(4,12))@AnotherGeek我不明白你的话。在Chrome控制台下,我得到的结果是[]。尼娜的回答解释得很好。