凑数(2)

wils
wils

创作者俱乐部成员

还是凑数问题,从一组数里,找出满足求和的子组合。

  • 昨天的代码里,每次尝试放入dat一个项目之后,会先对dat求和,然后比较判断

  • 求和这一步浪费了大量时间,其实每次递归,可以记住上次求和的结果,每次尝试放入项目之后,只需要进行一次相加

  • 简单说就是用空间换时间,缓存上次求和的结果

🔔

function* cs(arr, s)

{

arr.sort((x,y)=>x-y)

let len = arr.length

let dat = []

yield* rec(0, 0, 0)

function* rec(start, index, cur) {

if (index === len) return

for (let i = start; i < len; i++) {

dat[index] = arr[i]

let acc = cur + arr[i]

if (acc < s) {

yield* rec(i + 1, index + 1, acc)

}

else if (acc === s) {

yield dat.slice(0, index + 1)

}

else {

return

}

}

}

}

function coushu1(rng, s)

{

Application.Volatile(0)

return JSON.stringify(cs(rng().flat(), parseInt(s)).next().value)

}

function coushu(rng, s)

{

Application.Volatile(0)

return [...cs(rng().flat(), parseInt(s))].map(x=>[JSON.stringify(x)])

}

修改之后,处理几十个数不算太卡了,有点实用价值了,不过应该可以继续优化😁


半夜醒了,水一贴,继续睡。。。

广东省
浏览 352
收藏
4
分享
4 +1
3
+1
全部评论 3
 
zha7090
zha7090

创作者俱乐部成员

高手!这东东,我是一看就会,一写就废了
· 广东省
1
回复
 
青衫洗旧
学习
· 陕西省
1
回复
 
亂雲飛渡
学习
· 广东省
1
回复