双指针法在数组有序前提下以O(N)时间、O(1)空间解两数之和;需升序(或降序),若无序则排序使总复杂度升至O(N log N);适用于返回值或1-based下标(如LeetCode 167),不适用需原始下标的无序场景。

双指针法能在 O(N) 时间内解决两数之和问题,但前提是数组已排序。它不依赖哈希表,也不做重复枚举,靠的是有序性带来的确定性剪枝。
适用前提:必须是升序(或降序)数组
双指针不是万能钥匙——它高度依赖顺序信息。如果原数组无序,必须先排序,此时总时间复杂度变为 O(N log N),因为排序成了瓶颈。所以该方法天然适配像 LeetCode 167 这类明确标注“输入有序数组”的题目。
- 若题目给的是无序数组且要求返回原始下标(如 LeetCode 1),优先选哈希表法;双指针需额外记录索引映射,反而增加复杂度
- 若只需判断是否存在、或返回值本身(不要求原始位置),可放心排序后用双指针
- 升序与降序逻辑对称:升序时和小则左移、和大则右移;降序则反过来
核心操作:碰撞式收缩搜索区间
初始化 left = 0、right = len(nums) - 1,在 left 条件下循环:
- 计算
current_sum = nums[left] + nums[right] - 若等于
target,立即返回结果(如题目要 1-based 下标,则返回[left+1, right+1]) - 若
current_sum ,说明当前最小可配对项都太小,<strong>只能增大左值</strong> → <code>left += 1 - 若
current_sum > target,说明当前最大可配对项都太大,只能减小右值 →right -= 1
每次移动都安全排除一批不可能解:比如 nums[left] + nums[right] ,那所有 <code>i 对应的 <code>nums[i] + nums[right] 必然更小,全可跳过。
边界与细节处理
不需要手动防越界——循环条件 left 已保证两个指针不会交叉或重叠;移动后仍满足 <code>left ≤ right,直到相等时自动退出。
- 重复元素不影响正确性:只要存在一对满足条件即可终止;多个解时返回任意一个合法解即符合题意
- 题目若要求返回下标而非数值,注意区分“排序后数组下标”和“原始数组下标”——LeetCode 167 直接使用排序后下标(因输入已有序),无需映射还原
- 空间复杂度稳定为 O(1),不依赖额外容器
对比暴力与哈希表,看清优势所在
暴力法需检查约 N²/2 对组合;哈希表法时间 O(N) 但空间也要 O(N);双指针在有序前提下做到纯线性时间 + 常数空间,且逻辑直观、不易出错。
- 当
N = 10⁵时,暴力法操作量达 ~5×10⁹,而双指针最多 10⁵ 次加法+移动 - 在内存受限或嵌入式场景中,零额外空间的特性尤为关键
- 代码简洁,主干通常不超过 10 行,可读性和可维护性高

















