js实现不同数组m选n个数的组合算法

原理比较简单,m数组中的每个数要么出现,要么不出现,只要满足n个数出现就可以了

算法步骤:

1、先生成一个和m数组一样长度的临时数组flagArr(数组中除了0,就是1),flagArr中值为1的表示m该在位置的数字出现,0则表示不出现。初始化flagArr,前n位为1,其他全为0。

2、每次从左往右遍历数组flagArr,遇到第一个10,就将其变成01,再将变化位置左边所有1移动到数组的最左边。输出(保存)当前数组flagArr为结果。

3、继续循环步骤2,一旦遇到flagArr为右边n位全为1时,结束循环。

下边是代码实现:

    function getFlagArrs () {
      let m = 5
      let n = 3
      if (!n || n < 1) {
        return []
      }

      let resultArrs = []
      let flagArr = []
      let isEnd = false
      let 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++
        }
      }
      console.log(resultArrs)
      return resultArrs
    }
  }

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值