Leetcode

时间:2016-07-29 07:21:43

标签: javascript arrays algorithm slice

leetcode问题是:

  

找出所有可能的k个数字组合,它们加起来为n,假设只能使用1到9的数字,并且每个组合应该是一组唯一的数字。

     

示例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.slice(0)。但是,我得到的结果是[[]]。这是什么问题?

1 个答案:

答案 0 :(得分:1)

参考问题。如果使用切片,则会获得数组的副本。如果你只使用prefix,那么所有后来的操作,比如push或pop都会影响数组。

如果你不喜欢使用副本,你可以使用concat,它也会提供一个新数组,但是使用新项目。

您的代码如下所示:

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;
        search(from + 1, prefix.concat(from), k - 1, n - from);
        search(from + 1, prefix, k, n);
    }
};

console.log(combinationSum3(3, 7));
console.log(combinationSum3(3, 9));
console.log(combinationSum3(4, 12));