You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用JavaScript实现N个元素中取3个的组合乘积之和?

计算N个元素中取3个组合的乘积之和的正确解法

我明白你想解决的问题是:从给定的数字数组中,找出所有3个元素的组合,计算每个组合的乘积,最后把所有乘积加起来。之前的代码逻辑存在一些问题,导致没能得到正确结果,我来帮你梳理两种可行的解法——容易理解的暴力遍历版,以及效率更高的数学优化版。

一、暴力遍历解法(直观易实现)

这种方法通过三层循环遍历所有满足i < j < k的三元组,确保每个组合只被计算一次,逻辑非常直观:

function calcTripleProductSum(arr) {
  let total = 0;
  const len = arr.length;
  // 遍历第一个元素
  for (let i = 0; i < len; i++) {
    // 遍历第二个元素,必须在第一个元素之后
    for (let j = i + 1; j < len; j++) {
      // 遍历第三个元素,必须在第二个元素之后
      for (let k = j + 1; k < len; k++) {
        total += arr[i] * arr[j] * arr[k];
      }
    }
  }
  return total;
}

const arr = [2, 3, 4, 5, 6];
console.log(calcTripleProductSum(arr)); // 输出580,和手动计算的结果一致

这个方法的优点是逻辑简单,容易调试,但缺点也很明显:时间复杂度是O(n³),当数组元素数量很大时(比如n=1000),运行速度会非常慢。

二、数学优化解法(高效O(n)时间复杂度)

我们可以利用数学恒等式来优化计算,把时间复杂度降到O(n),适合处理大规模数组。

核心推导思路:

假设:

  • S1:数组所有元素的和
  • S2:数组所有元素的平方和
  • P2:数组所有二元组的乘积之和,公式为 P2 = (S1² - S2) / 2

对于每个元素x,它参与的所有三元组的乘积之和,等于x乘以剩下元素的所有二元组乘积之和。而每个三元组会被三个元素各计算一次,所以最终的三元组乘积和等于所有元素贡献的总和除以3。

实现代码:

function calcTripleProductSumOptimal(arr) {
  // 计算所有元素的和S1
  const S1 = arr.reduce((acc, num) => acc + num, 0);
  // 计算所有元素的平方和S2
  const S2 = arr.reduce((acc, num) => acc + num * num, 0);
  // 计算所有二元组的乘积之和P2
  const P2 = (S1 * S1 - S2) / 2;

  let totalContribution = 0;
  for (const num of arr) {
    // 计算去掉当前元素后,剩下元素的二元组乘积之和
    const restP2 = P2 - S1 * num + num * num;
    // 累加当前元素的贡献
    totalContribution += num * restP2;
  }

  // 每个三元组被计算了3次,所以除以3得到最终结果
  return totalContribution / 3;
}

const arr = [2, 3, 4, 5, 6];
console.log(calcTripleProductSumOptimal(arr)); // 输出580,和暴力解法结果一致

为什么你的代码没能成功?

你之前的代码逻辑存在几个关键问题:

  1. 内层循环中sum += arr[j] + arr[j + 1] + arr[j + 2]是在做加法,而不是计算二元组的乘积,完全偏离了需求;
  2. 当j接近数组末尾时,j+1或j+2会超出数组索引范围,导致错误;
  3. total += sum * arr[i] + arr[i + 1] + arr[i + 2]的累加逻辑完全不符合三元组乘积的计算规则,最终结果自然不正确。

内容的提问来源于stack exchange,提问作者370147

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 19:32:50