
本文详解如何正确生成数组中所有不同元素两两相加的结果,明确指出线性时间复杂度不可行,并提供简洁、健壮的 o(n²) 实现方案及关键注意事项。
本文详解如何正确生成数组中所有不同元素两两相加的结果,明确指出线性时间复杂度不可行,并提供简洁、健壮的 o(n²) 实现方案及关键注意事项。
要生成一个数组中所有无序、不重复、且不包含自加的两两元素之和(即对任意索引 i < j,计算 arr[i] + arr[j]),本质是枚举所有组合(combination),而非相邻元素或固定偏移的配对。题目中期望输出 [5,1,3] → [6,8,4](对应 5+1、5+3、1+3),说明需覆盖全部 C(n,2) = n×(n−1)/2 种唯一数对——这决定了时间复杂度下限为 O(n²),不存在真正的线性解法(O(n))。所谓“避免嵌套循环”在数学上不可行,因为输出长度本身已是 Θ(n²)。
正确的实现应使用双层循环,外层控制首元素索引 i,内层从 i+1 开始遍历,确保每对仅计算一次且不包含 arr[i] + arr[i]:
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]✅ 关键设计要点:
- 内层循环起始为 j = i + 1,天然排除 i === j(自加)和已处理过的逆序对(如 1+5 不再重复计算),保证组合唯一性;
- 输出顺序与输入索引顺序一致(按 i 递增、j 递增),但题目明确“顺序无关”,故无需额外排序或去重(输入无重复值时结果自然无重复);
- 空数组或单元素数组返回空数组 [],逻辑自然兼容边界情况。
⚠️ 常见误区警示:
- 错误地只遍历相邻元素(如 arr[i] + arr[i+1]),会遗漏非邻接对(如 [5,1,3] 中的 1+3);
- 使用 Set 去重虽可应对输入含重复值的场景,但题目未要求且增加常数开销,非必要;
- 尝试用前缀和、哈希映射等技巧无法规避组合枚举本质,强行“优化”反而引入错误逻辑。
总结:该问题属于典型的组合生成任务,O(n²) 是理论最优时间复杂度。聚焦清晰的双重索引逻辑、严格遵循 i < j 约束,即可稳健、可读、高效地解决问题。

















