第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

查找總和為 N 或更小的所有可能的 L 大小數(shù)組的算法

查找總和為 N 或更小的所有可能的 L 大小數(shù)組的算法

蝴蝶不菲 2023-03-18 17:20:07
我想在 JavaScript 中找到所有可能的數(shù)組 - 非負(fù)整數(shù) - 大小L總和 - 至多 - :Nfunction findArrays(size, maxSum){}輸入示例: findArrays(3, 2)示例輸出:[[0,0,0], [0,0,1], [0,0,2], [0,1,0], [0,1,1], [0,2,0], [1,0,0], [1,0,1], [1,1,0], [2,0,0]]我嘗試了什么:我想出了這個(gè)算法:從左邊開始,添加數(shù)組成員如果總和等于Nat slot i:如果當(dāng)前索引處的成員等于N,則將所有索引重置到此處并遞增下一個(gè)槽否則:重置以前的插槽并增加此插槽否則:增加第一個(gè)可用插槽我的代碼:let getNextArray = (r,L,N)=>{    let sum=0, ind=0, i;    for(i=0; i<L; i++){        sum += r[i];        if(sum===N){            ind = i + (r[i]===N?1:0);            break;        }    }    r[ind]++;    for(i=0; i<ind; i++){        r[i]=0;    }    return r;};let findArrays=(L, N)=>{    let arrays=[],r=[],i;    for(i=0; i<L; i++){        r[i] = 0;    }    while(r[L-1]<N){        r = getNextArray(r,L,N);        arrays.push(r.slice());    }    return arrays;}它適用于我的示例輸入,但當(dāng)我調(diào)用它時(shí),findArrays(5,3)它會(huì)找到一半 (28 / 56) 的答案。即使我讓它工作,我懷疑它對(duì)于更大的輸入是否有效,因?yàn)樗鼤?huì)計(jì)算每輪的總和。我敢肯定有一種我找不到的更聰明的方法來做到這一點(diǎn)..昨天我問了一個(gè)類似的問題,在效率方面有一個(gè)很好的答案,但我意識(shí)到我需要固定大小的數(shù)組。為類似的問題道歉,但也許有一天它會(huì)幫助別人 :)我也可以使用一種方法findArrays(size, sum)并用 sums 迭代它1:N,不幸的是我也不知道該怎么做。
查看完整描述

2 回答

?
莫回?zé)o

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊

您可以在末尾修改trincot的解決方案filter

function findArrays(maxSize, maxSum) {

? let arr = [];

? let result = []; // <--- will collect all the subarrays


? function recur(maxSum) {

? ? let k = arr.length;

? ? result.push([...arr]);

? ? if (k === maxSize) return;

? ? for (let i = 0; i <= maxSum; i++) {

? ? ? arr[k] = i;

? ? ? recur(maxSum - i);

? ? }

? ? arr.length = k;

? }


? recur(maxSum);

? return result.filter(({ length }) => length == maxSize);

}


// demo

for (let arr of findArrays(3, 2))

? console.log(JSON.stringify(arr));



查看完整回答
反對(duì) 回復(fù) 2023-03-18
?
慕妹3242003

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超6個(gè)贊

這是遞歸函數(shù)的非生成版本,它將給出您想要的結(jié)果。它計(jì)算出當(dāng)前級(jí)別 ( 0..maxSum) 的所有可能值,然后將它們附加到數(shù)組的所有可能結(jié)果中size-1:


const findArrays = (size, maxSum) => {

  let possibles = Array.from({

    length: maxSum + 1

  }, (_, i) => i);

  if (size == 1) return possibles;

  let result = [];

  possibles.forEach(p => {

    findArrays(size - 1, maxSum - p).forEach(a => {

      result.push([p].concat(a));

    });

  });

  return result;

}


console.log(findArrays(3, 2));


查看完整回答
反對(duì) 回復(fù) 2023-03-18
  • 2 回答
  • 0 關(guān)注
  • 108 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)