我想在 JavaScript 中找到所有可能的数组 - 非负数 - 总和 - 至多 - N:
function findArrays(maxSize, maxSum){}
输入示例: findArrays(3, 10)
一些可接受的输出:(不写全部,因为它太长了)
[[0], [0,0,0], [10,0,0], [1,9], [1,2,3] /*, ... */]
到目前为止我尝试了什么:
我知道它看起来像家庭作业,但它不是 :) 我可以想到一个解决方案,它只生成所有 ( size*maxSum
) 个可接受大小的可能数组,然后遍历它们以检查总和是否大于maxSum
。但是,我认为随着变大,这种解决方案在性能方面非常糟糕maxSum
。我正在寻找更有效的实施,但我不知道从哪里开始。
我的“坏”解决方案
function getNextArray(r,maxVal){
for(var i=r.length-1;i>=0;i--){
if(r[i]<maxVal){
r[i]++;
if(i<r.length-1){
r[i+1]=0;
}
break;
}
}
return r;
}
function getAllArraysOfSize(size, maxVal){
var arrays=[],r=[],i;
for(i=0;i<size;i++){
r[i]=0;
}
while(r.reduce((a, b) => a + b, 0) < (maxVal*size)){
r = getNextArray(r.slice(),maxVal);
arrays.push(r);
}
return arrays;
};
function findArrays(maxSize, maxSum){
var allArrays=[],arraysOfFixedSize=[],acceptableArrays=[],i,j;
for(i=1; i<=maxSize; i++){
arraysOfFixedSize=getAllArraysOfSize(i,maxSum);
for(j=0; j<arraysOfFixedSize.length; j++){
allArrays.push(arraysOfFixedSize[j]);
}
}
for(i=0; i<allArrays.length; i++){
if(allArrays[i].reduce((a, b) => a + b, 0) <= maxSum){
acceptableArrays.push(allArrays[i]);
}
}
return acceptableArrays;
};