慕后森
var arr = [2, 2, 3]; var p = [] for (var i = 1; i <= arr[0]; i++) { for (var j = 1; j <= arr[1]; j++) { for (var k = 1; k <= arr[2]; k++) { p.push([i, j, k]) } } } console.log(p); let arr = [2,4,2,3]; var _arr = []; for (var i = 0; i < arr.length; i++) { var s = []; for (var j = 1; j <= arr[i]; j++) { s.push(j); } _arr.push(s); } var p = _arr.reduce(function (pre, cur) { var a = []; for (var i = 0; i < pre.length; i++) { for (var j = 0; j < cur.length; j++) { a.push([].concat(pre[i], cur[j])) } } return a; }) console.log(p)应该可以nlog(n) 时间复杂度,但是不会let arr = [23,35,23,36,5];var _arr = [];for (var i = 0; i < arr.length; i++) { var s = []; for (var j = 1; j <= arr[i]; j++) { s.push(j); } _arr.push(s);}var p = [];function f(arr) { var len = arr.length; if (len < 2) { return arr[0]; } var mid = Math.ceil(len / 2), left = arr.slice(0, mid), right = arr.slice(mid); return z(f(left), f(right));}function z(left, right) { var a = []; for (var i = 0; i < left.length; i++) { for (var j = 0; j < right.length; j++) { a.push([].concat(left[i], right[j])) } } return p.concat(a);}console.log(p)最后一种效率会高一点
忽然笑
如果你最多是3个数据,就是supreme的方法就好了,如果还可能更多的数据,甚至数据数不定,这个其实要用递归或者分治算法(用来解决递归算法层数过多的问题),这个就比较复杂了。其实这个问题用位运算是比较好算的,也可以结合分治来处理:根据数组元素数量N,可以分成N段二进制数据位根据每个数据元素An,则N段二进制数位的值范围就可以得出(二进制位数),并有一个对应的最大值An-1所有的组合就和这个N段2进制位数(假设总共有M位),则0-2^M-1共2^M个数中滤除各段不符合情况后的数据,根据段分开后对应值的组合,即遍历0-这个二进制数范围内这样遍历一遍0-2^M,滤除各段不符合的情况就可以得出所有合适情况了。以[2,2,3]为例来介绍,我们从低位开始作为处理2,表示1,2 二种状态,对应1位二进制,最大值2-1=12,表示1,2 二种状态,对应1位二进制,最大值2-1=13,表示1,2,3 3种状态,对应2位二进制,最大值3-1=2这样,需要1+1+2共4位二进制数来表示所有组合,其中还需要滤除最高位的2个段的一些情况(2位2进制数其实可以表示4种状态的),后面注意是低位开始对应00 0 0,对应1,1,100 0 1, 对应2,1,100 1 0,对应1,2,100 1 1,对应2,2,101 0 0,对应1,1,201 0 1,对应2,1,201 1 0,对应1,2,201 1 1,对应2,2,210 0 0,对应1,1,310 0 1,对应2,1,310 1 0,对应1,2,310 1 1,对应2,2,311 0 0 位段超出不符合11 0 1 位段超出不符合11 1 0 位段超出不符合11 1 1 位段超出不符合算法思路就介绍到这里,实现其实不是太复杂,不过如果位数太多了(超出语言处理范围)还是需要分治这个问题如果真实的规模比较大,还需要考虑空间复杂度和时间复杂度问题,递归肯定是不行的,就是转换递归为循环,空间复杂度也不一定好(当然实际情况下也不该由javascript来处理这么大复杂度的问题,但仍需考虑不是)。这里再给出一个循环的方式var arr = [2,2,3,2,5]; function MC(inarr,n){ var rt=[]; for(var i=0;i<inarr.length;i++){ for(var j=1;j<=n;j++){ var t=inarr[i].concat(); t.push(j); rt.push(t) } } return rt;}var mrt=[[]];for(var i=0;i<arr.length;i++){ mrt=MC(mrt,arr[i]);}console.log(mrt);