代码与动画 TWO POINTERS
双指针.
在有序数组两端移动指针,寻找和为目标值的一对元素。
时间 O(n)空间 O(1)升序数组
原理与执行逻辑
在升序数组两端各放一个指针,通过两数之和与目标的大小关系排除一侧候选。每次移动一个指针,直到找到配对或指针相遇。
执行步骤
- left 指向开头,right 指向末尾。
- 计算 a[left] + a[right],等于目标就返回两个下标。
- 和偏小时增加 left,和偏大时减少 right。
- left 不再小于 right 时停止,未命中返回空数组。
关键理解
和偏小时,当前左值与范围内任何更小右值的和也不足;和偏大时,当前右值与任何更大左值的和也超限。排序是这种排除逻辑的前提。
简短示例
[1, 2, 4, 6, 9] 查找和 10,先比较 1 + 9,直接得到下标 [0, 4];目标为 8 时右移左指针或左移右指针,最终找到 2 + 6。
代码与执行动画
STEP 0 / 4function twoSumSorted(a, target) { let left = 0, right = a.length - 1; while (left < right) { const sum = a[left] + a[right]; if (sum === target) return [left, right]; if (sum < target) left++; else right--; } return [];}当前数据正在操作已访问 / 命中标记 / 指针
0
初始化两端指针
目标和 10,从左右两端开始比较。
配置演示数据
应用后重新生成执行过程,可单步观察结果。
双指针的操作规则
输入必须有序;返回从 0 开始的两个下标。和偏小时左指针右移,和偏大时右指针左移,找不到返回空数组。
对应题目与扩展练习
观察执行过程后,按题目约束调整输入、返回值与实现。链接打开官方题目页面。
直接对应两端指针移动;题目返回从 1 开始的下标。
- 扩展练习27. 移除元素打开题目
扩展为读写指针同向移动,原地压缩数组。