【问题标题】:Combination Sum III on LeetcodeLeetcode 上的组合总和 III
【发布时间】:2016-07-29 07:21:42
【问题描述】:

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)。但是,我得到的结果是 [ [ ] ]。这里有什么问题?

【问题讨论】:

  • @AnotherGeek 我听不懂你的话。在 Chrome 控制台下,我得到的结果是 [ [ ] ]。尼娜的回答很好解释。

标签: javascript arrays algorithm slice


【解决方案1】:

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

如果您不喜欢使用副本,您可以使用 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));

【讨论】:

    猜你喜欢
    • 2020-09-14
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 2019-10-30
    • 1970-01-01
    相关资源
    最近更新 更多