
本文讲解如何遍历数组,计算所有不重复元素对的和并存入新数组,重点分析时间复杂度限制与正确实现方式,澄清“线性时间解法”在该问题中的不可行性。
本文讲解如何遍历数组,计算所有不重复元素对的和并存入新数组,重点分析时间复杂度限制与正确实现方式,澄清“线性时间解法”在该问题中的不可行性。
要生成一个数组中所有无序、不重复元素对(即 i ,本质是枚举所有组合(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
function sumTwo(arr) {
const results = [];
for (let i = 0; i <p>⚠️ 注意事项: </p>
- 错误写法(如原尝试中仅 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 分片处理),而非徒劳追求不存在的线性解法。











