双指针法在排序数组中找目标和的核心是利用数组有序性实现夹逼查找,时间复杂度O(n):左指针从0起、右指针从末尾起,和等于目标则返回,小于则左指针右移,大于则右指针左移,确保不漏解。

双指针法在排序数组中找目标和,核心是利用数组已有序的特性,避免暴力遍历,把时间复杂度从 O(n²) 降到 O(n)。它不依赖哈希表,也不需要额外空间存索引映射,逻辑清晰、执行轻快。
适用前提:数组必须升序排列
这是双指针能“夹逼推进”的基础。若原数组无序,得先排序——但注意:排序会打乱原始下标。如果题目要求返回原始位置(如力扣1号题),就得提前用 (数值, 原下标) 元组保存并一起排序;如果只需求值或题目已明确给出有序数组(如力扣167号题),可直接上双指针。
左右指针怎么设、怎么动
初始化左指针 left = 0(最小值端),右指针 right = len(nums) - 1(最大值端)。每次计算 nums[left] + nums[right],按结果分三种情况处理:
- 和等于 target → 找到解,直接返回 [left, right] 或对应原始下标
- 和小于 target → 当前左值太小,left 右移一位 换个更大的数
- 和大于 target → 当前右值太大,right 左移一位 换个更小的数
为什么不会漏掉答案
因为数组有序,移动有方向性且不可逆:
- 当 sum
- 当 sum > target 时,同理,nums[right] 和任意 nums[k](k ≥ left)相加都 ≥ 当前 sum,right 安全左移
- 两个指针逐步靠拢,最多遍历 n 次就结束,不会跳过唯一解
扩展:两个独立有序数组求和匹配
比如数组 A 和 B 都升序,找 A[i] + B[j] == x。做法类似:固定 A 从左往右扫(i),B 从右往左扫(j)。对每个 A[i],不断左移 j 直到 A[i] + B[j] ≤ x;一旦相等就返回 (i, j)。本质仍是利用单调性剪枝,避免双重循环。










