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