
本文讲解如何正确生成一个数字数组中所有不同索引元素两两相加的结果,明确指出线性时间复杂度(O(n))不可行,并提供简洁、正确的 O(n²) 实现方案及关键注意事项。
本文讲解如何正确生成一个数字数组中所有不同索引元素两两相加的结果,明确指出线性时间复杂度(o(n))不可行,并提供简洁、正确的 o(n²) 实现方案及关键注意事项。
要实现“对数组中每一对不同位置的元素求和,并收集所有结果”,本质是生成所有无序且不重复的索引对 (i, j),其中 i < j,然后计算 arr[i] + arr[j]。这是经典的组合问题:从 n 个元素中任取 2 个的组合数为 C(n,2) = n×(n−1)/2,因此至少需要输出 O(n²) 个结果——这意味着任何正确算法的时间复杂度下界即为 O(n²),不存在真正的线性时间解法。所谓“避免嵌套循环”在此场景下无法绕过数学本质。
正确的实现需使用双层循环,外层控制第一个元素索引 i,内层从 i+1 开始遍历以确保不重复、不自加:
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] 只计算了相邻元素之和,遗漏了所有非相邻组合(如 5+3),故结果错误;
- i < j 的约束保证了 (5,1) 和 (1,5) 不会重复出现,符合“不重复、不自加”要求;
- 若输入为空数组或仅含 1 个元素,内层循环自动跳过,返回空数组 [],逻辑自然鲁棒;
- 虽然时间复杂度为 O(n²),但空间复杂度也为 O(n²)(因需存储全部组合和),这是问题本身决定的最优表现。
总结:该任务无法降至线性时间,双层循环(i 从 0 到 n−2,j 从 i+1 到 n−1)是最清晰、最高效且符合数学本质的标准解法。优化方向应聚焦于可读性与边界处理,而非试图违背组合爆炸的底层规律。

















