问题描述
我正在尝试仅在'console.log(partial)'下填充一个不同的数组,例如,如果target = 5并且我有一组数字[1,1,2,2 ],子集将只给我这两个数组:[1,2]或[1,2]。但是,在我的控制台日志中,相同的两组数组被多次填充。我的代码有问题吗?
function subsetSum(numbers,target,partial) {
var s,n,remaining;
partial = partial || [];
// sum partial
s = partial.reduce(function (a,b){
return a + b;
},0);
// check if the partial sum is equals to target
if (s === target) {
console.log("%s=%s",partial.join("+"),target)
console.log(partial)
for(j = 0; j < partial.length; j++){
if (partial[j] == 1){
console.log("here")
}
}
}
if (s >= target) {
return; // if we reach the number why bother to continue
}
for (var i = 0; i < numbers.length; i++) {
n = numbers[i];
remaining = numbers.slice(i + 1);
subsetSum(remaining,partial.concat([n]));
}
return;
}
解决方法
您得到一个以上的结果
[1,1,2,2]
因为您拥有多个具有相同值的元素。
例如,如果您对值进行编号并且仅使用整数值,则可以看到这种情况。
要排除相同的结果,您需要在结果集中进行搜索,并避免重复输入相同的数字。
function subsetSum(numbers,target,partial = []) {
const
sum = partial.reduce((a,b) => a + parseInt(b,10),0),result = [];
if (sum === target) return [partial];
if (sum > target) return [];
for (let i = 0; i < numbers.length; i++) {
const n = numbers[i];
result.push(...subsetSum(numbers.slice(i + 1),partial.concat(n)));
}
return result;
}
subsetSum(['1#1','1#2','1#3','1#4','1#5','2#1','2#2'],5).forEach(a => console.log(...a));
.as-console-wrapper { max-height: 100% !important; top: 0; }