双层循环暴力遍历适用于小规模数组,时间复杂度o(n²);哈希查找(unordered_set)适合存在性判断,平均o(n);需完整和值时先生成vector再排序去重;注意int溢出,推荐long long或溢出检测。

用双层循环暴力遍历所有元素对
这是最直接的解法,适用于小规模数组(比如长度 ≤ 1000),时间复杂度 O(n²),空间复杂度 O(1)(不计输出存储)。关键点在于内层循环起始索引必须大于外层索引,避免重复计算和自加:
- 外层
i从0到n-2,内层j从i+1到n-1 - 如果写成
j = 0或j = i,会导致a[i] + a[i](自加)或同一对被算两次 - 示例:对
int arr[] = {1, 2, 3},只生成1+2、1+3、2+3
用 std::set 或 std::unordered_set 快速查重或去重
当问题变成「是否存在两数之和等于目标值」或「返回所有不重复的两数之和结果」时,单次遍历 + 哈希查找更高效(O(n) 平均时间)。但注意:std::set 插入和查找是 O(log n),std::unordered_set 是平均 O(1),但需处理哈希冲突:
- 遍历每个元素
arr[i],检查target - arr[i]是否已在集合中 - 若存在,说明找到一对;否则将
arr[i]插入集合 - 该方法无法直接还原原始下标(除非存
pair<value index></value>),且不能用于生成全部和值(会漏掉重复和)
用 std::vector<int></int> 存储所有两两和并排序去重
当需要完整列出所有可能的和值(比如做频次统计或找第 k 小和),必须先生成再后处理。常见错误是边插入边去重导致性能暴跌:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 先用双层循环把所有
arr[i] + arr[j]推入std::vector<int></int> - 再调用
std::sort()+std::unique(),比每次插入前查重快得多 - 若数组含负数,和的范围可能很大,
std::vector比std::set内存更紧凑、缓存更友好 - 示例:对
{-1, 0, 1},生成{-1, 0, 1}(三个和),不是六个
注意 int 溢出和有符号整数边界
两数相加可能超出 int 表示范围,尤其在竞赛题或嵌入式场景中容易被忽略。C++ 不做运行时溢出检查,结果是未定义行为:
- 若数组元素最大为
INT_MAX/2,两个相加仍安全;若接近INT_MAX,就危险 - 稳妥做法:用
long long存储中间和,或提前判断:if (a > INT_MAX - b) { /* overflow */ } - 使用
std::add_overflow(C++23)可标准化检测,但目前主流编译器支持有限
实际写的时候,别急着套模板——先看清楚需求到底要什么:是判断存在性?枚举所有和?还是找特定目标?不同目标对应完全不同的数据结构和边界处理方式。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










