问题描述给定一个数组及数字 k ,从数组中找出所有相加结果为 k 的组合。 示例: 给定数组 给定数组 分析这里的思路是把 所以对于第一个结果的查找,可以从索引为 0 的位置开始遍历数组:
第二个结果:
... 直到进行到数组的最后一个元素。将前面得到的结果组合后返回。 实现根据上面的分析得出如下的实现: /**
* k-sum 实现,从候选数组中找出所有相加结果为 k 的组合
* @param {*} arr 候选数组
* @param {*} k 目标数字
*/
function ksum(arr, k) {
var result = [];
function process(input, tmpK, tmpResult) {
tmpResult = tmpResult || [];
if (tmpK === 0 && tmpResult.length > 0) {
tmpResult.sort((a, b) => a - b);
var hasDuplicate = result.some(v => {
return v.join("") === tmpResult.join("");
});
if (!hasDuplicate) {
result.push(tmpResult);
}
} else if (tmpK > 0) {
for (let i = 0; i < input.length; i++) {
const num = input[i];
process(input.slice(i + 1), tmpK - num, tmpResult.concat(num));
}
}
}
process(arr, k);
return result;
}
测试: console.log(ksum([1,1,1], 2));
// [ [ 1, 1 ] ]
console.log(ksum([10, 1, 2, 7, 6, 1, 5], 8));
// [ [ 1, 2, 5 ], [ 1, 7 ], [ 1, 1, 6 ], [ 2, 6 ] ]
相关资源 |
k-sum 问题
猜你喜欢
转载自www.cnblogs.com/Wayou/p/k_sum_problem.html
今日推荐
周排行