Leetcode上的组合Sum III



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替换prefix.sice(0)。然而,我得到的结果是[[]]。这里的问题是什么?

这是一个引用问题。如果使用slice,则会得到数组的副本。如果只使用prefix,那么后面的所有操作(如推送或弹出)都会影响数组。

如果你不喜欢使用副本,你可以使用concat,它也会提供一个新的数组,但带有新的item/s。

你的代码应该是这样的:

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));

最新更新