算法

  1. 从一个数组中找出 N 个数,其和为 M 的所有可能
// 参数依次为目标数组、选取元素数目、目标和
const search = (arr, count, sum) => {
  // 计算某选择情况下有几个 `1`,也就是选择元素的个数
  const n = num => {
    let count = 0;
    while(num) {
      num &= (num - 1);
      count++;
    }
    return count;
  }
  
  let len = arr.length, bit = 1 << len, res = [];
  // 遍历所有的选择情况
  for(let i = 1; i < bit; i++){
    // 满足选择的元素个数 === count
    if(n(i) === count){
      let s = 0, temp = [];
      // 每一种满足个数为 N 的选择情况下,继续判断是否满足 和为 M
      for(let j = 0; j < len; j++){
        // 建立映射,找出选择位上的元素
        if((i & 1 << j) !== 0) {
          s += arr[j];
          temp.push(arr[j]);
        }
      }
      // 如果这种选择情况满足和为 M
      if(s === sum) {
        res.push(temp);
      }
    }
  }
  return res;
}

参考链接:
https://mp.weixin.qq.com/s?__biz=MzA5NzkwNDk3MQ==&mid=2650589268&idx=1&sn=7c526a76eb99643f5dc8507657ce2bd1&chksm=8891d870bfe651663db4b63b94da0fba913bd42423ed5042d599203bf320de798e9b849136d3&scene=38#wechat_redirect

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值