双指针法可在o(n)时间复杂度内判断排序数组中是否存在两数之和等于目标值,核心是利用有序性每次排除一整批无效组合:和小则左指针右移,和大则右指针左移,两指针各遍历至多一次。

直接用双指针,不用额外空间,一遍扫完就能判断是否存在两数之和等于目标值。
为什么双指针在这里能降到 O(n)
关键前提是数组已排序。这使得每次比较后,都能安全排除一整批不可能的组合:比如当前左指针在 i、右指针在 j,若 numbers[i] + numbers[j] ,那所有比 numbers[i] 更小的数(即 i 左边的数)和 numbers[j] 相加,结果只会更小——全可跳过,所以只让左指针右移;反之若和太大,就让右指针左移。两个指针最多各走一遍,总操作数 ≤ n。
具体操作步骤
- 初始化 left = 0,right = 数组长度 − 1
- 进入循环,只要 left
- 计算 currentSum = numbers[left] + numbers[right]
- 如果 currentSum == target,立即返回 true(或记录下标)
- 如果 currentSum
- 如果 currentSum > target,right--(减小和)
- 循环结束都没找到,说明不存在
注意边界与细节
不需要担心越界——因为 while 条件是 left
和暴力法对比一目了然
暴力法要枚举所有 (i, j) 对,共约 n²/2 次加法;双指针最多做 n−1 次加法和指针移动。当数组长度从 1000 增到 10000,暴力法耗时增长约 100 倍,双指针只增长 10 倍——这才是真正的线性可扩展。










