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