
本文讲解如何遍历数组,计算所有不重复元素对的和并存入新数组,重点分析时间复杂度限制与正确实现方式,澄清“线性时间解法”在该问题中的不可行性。
本文讲解如何遍历数组,计算所有不重复元素对的和并存入新数组,重点分析时间复杂度限制与正确实现方式,澄清“线性时间解法”在该问题中的不可行性。
要生成一个数组中所有无序、不重复元素对(即 i < j)的两数之和,本质是枚举所有组合(combinations),而非相邻元素或固定偏移的配对。示例 [5, 1, 3] 需输出 5+1、5+3、1+3 共 3 个结果;[5, 1, 3, 2] 则需输出 C(4,2) = 6 个和 —— 这正是组合数学中从 n 个元素中选 2 个的总数:n(n−1)/2。
因此,该问题的输出规模本身已是 Θ(n²)。即使算法逻辑再精简,也必须产生约 n²/2 个结果,故任何正确解法的时间复杂度下界为 O(n²),不可能达到 O(n) 或 O(n log n)。所谓“不用嵌套循环实现线性时间”在数学上不成立——你无法用单次遍历生成 n² 量级的数据。
正确的实现应使用标准双指针式嵌套循环,确保每对 (i, j) 满足 i < j,避免自加(如 arr[i] + arr[i])和重复(如 arr[j] + arr[i] 已被 arr[i] + arr[j] 覆盖):
function sumTwo(arr) {
const results = [];
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
results.push(arr[i] + arr[j]);
}
}
return results;
}
console.log(sumTwo([5, 1, 3])); // [6, 8, 4]
console.log(sumTwo([5, 1, 3, 2])); // [6, 8, 7, 4, 3, 5]⚠️ 注意事项:
- 错误写法(如原尝试中仅 arr[i] + arr[i+1])只计算相邻元素和,漏掉所有跨距 ≥2 的组合;
- 若强行避免显式嵌套循环(例如用 flatMap + slice),内部仍隐含 O(n²) 迭代,且可读性下降;
- 若后续需去重或排序,应在 return 前单独处理(如 return [...new Set(results)].sort((a,b) => a-b)),但会额外增加时间开销;
- 对超大数组(如 n > 10⁴),输出数组将含 ~5×10⁷ 项,需评估内存与性能边界。
总结:本题是典型的组合枚举问题。接受 O(n²) 时间复杂度是合理且必要的;优化方向应聚焦于代码可维护性、内存局部性或并行化(如 Web Worker 分片处理),而非徒劳追求不存在的线性解法。

















