长度为2n的数组拆分成两个n长度的数组的和之间的差绝对值最小值【递归】

该博客探讨了一种通过排序和遍历数组来寻找两组组合,使得它们的元素之和与原数组总和的差值绝对值最小的方法。具体实现是通过递归切分数组并计算组合数,然后计算每组组合的和,最后找到使差值最小的组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//思路是先排序,两个数组绝对值最小那么通过一个数组中比较大的值去替换另一个数组中比较小的值,求得它们的组合数,再分别计算即可
let arr = [1,5,62,5,23,-62,6,22,-2,-5];

let n = arr.length / 2;

function name(arr, n) {
  let leftArr = [];
  let rightArr = [];
  let l = arr.length;
  let total = arr.reduce((a, b) => a + b);
  let min = Infinity;
  function slice(ta, t, b = true, s = 0, dd = []) {
    if (dd.length === t) {
      if (b) {
        leftArr.push(dd);
      } else {
        rightArr.push(dd);
      }
    }
    for (let i = s; i < ta.length; i++) {
      slice(ta, t, b, i + 1, dd.concat(ta[i]));
    }
  }

  for (let j = 1; j < n; j++) {
    slice(arr.slice(0, n), j, true);
    slice(arr.slice(n, l), j, false);
  }

  for (let i = 0; i < leftArr.length; i++) {
    const e = leftArr[i];
    for (let j = 0; j < rightArr.length; j++) {
      const e1 = rightArr[j];
      if (e.length + e1.length === n) {
        const temp = e.reduce((a, b) => a + b) + e1.reduce((a, b) => a + b);
        min = Math.min(min, Math.abs(total - 2 * temp));
      }
    }
  }
  console.log(leftArr, rightArr, min);
}

name(arr.sort((a, b) => a - b), n);

``
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值