[整] JavaScript m选n组合算法
01转换法:
思路是开一个数组,其下标表示1到m个数,数组元素的值为1表示其下标代表的数被选中,为0则没选中。
- 首先初始化,将数组前n个元素置1,表示第一个组合为前n个数。
- 然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合;
- 同时将其左边的所有“1”全部移动到数组的最左端。
- 当第一个“1”移动到数组的m-n的位置,即n个“1”全部移动到最右端时,就得到了最后一个组合。
例如求5选3的组合:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 1 1 1 0 0 //1,2,3 1 1 0 1 0 //1,2,4 1 0 1 1 0 //1,3,4 0 1 1 1 0 //2,3,4 1 1 0 0 1 //1,2,5 1 0 1 0 1 //1,3,5 0 1 1 0 1 //2,3,5 1 0 0 1 1 //1,4,5 0 1 0 1 1 //2,4,5 0 0 1 1 1 //3,4,5 |
JavaScript实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | /** * 获得指定数组的所有组合 */ function arrayCombine(targetArr) { if (!targetArr || !targetArr.length) { return []; } var len = targetArr.length; var resultArrs = []; // 所有组合 for ( var n = 1; n < len; n++) { var flagArrs = getFlagArrs(len, n); while (flagArrs.length) { var flagArr = flagArrs.shift(); var combArr = []; for ( var i = 0; i < len; i++) { flagArr[i] && combArr.push(targetArr[i]); } resultArrs.push(combArr); } } return resultArrs; } /** * 获得从m中取n的所有组合 */ function getFlagArrs(m, n) { if (!n || n < 1) { return []; } var resultArrs = [], flagArr = [], isEnd = false , i, j, leftCnt; for (i = 0; i < m; i++) { flagArr[i] = i < n ? 1 : 0; } resultArrs.push(flagArr.concat()); while (!isEnd) { leftCnt = 0; for (i = 0; i < m - 1; i++) { if (flagArr[i] == 1 && flagArr[i+1] == 0) { for (j = 0; j < i; j++) { flagArr[j] = j < leftCnt ? 1 : 0; } flagArr[i] = 0; flagArr[i+1] = 1; var aTmp = flagArr.concat(); resultArrs.push(aTmp); if (aTmp.slice(-n).join( "" ).indexOf( '0' ) == -1) { isEnd = true ; } break ; } flagArr[i] == 1 && leftCnt++; } } return resultArrs; } |
分类:
JavaScript
标签:
组合算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架