算法概念速查
什么是双指针?对撞、同向、快慢三种用法一次讲清
更新:2026-07-03吴师兄图解算法
一句话定义
双指针是让两个下标按一定规则在数组或链表上移动的技巧,靠「有序性」或「已处理过的信息」保证每次移动都不会漏掉答案,从而省去一层循环,把 O(n²) 降到 O(n)。常见三种形态:从两端往中间走的对撞指针、一前一后同方向推进的同向指针、一步与两步赛跑的快慢指针。
先打个比方
对撞指针像两个人从书架两端同时往中间找一对书:总价超了,右边的人换本便宜的;不够,左边的人换本贵的——每一步都有明确依据,绝不瞎猜。快慢指针像操场上一快一慢两个跑步者:跑道如果是环形,快的迟早从背后套圈追上慢的。
它是怎么运作的
对撞指针的灵魂是「每一步都能安全排除一个候选」。以有序数组找两数之和为例:两数之和大了,右指针左移(右边任何数配当前左指针都只会更大);小了,左指针右移。每步排除一个下标,n 步收敛,这正是它必须先有序(或有单调结构)的原因。
同向指针(读写指针)用于原地改数组:读指针遍历每个元素,写指针只在「该保留」时前进,如原地去重、移动零。快慢指针专攻链表:判环、找中点、找倒数第 k 个,靠速度差或步数差取代额外空间。
什么时候用:识别信号
题目里出现下面任何一条,就该想到「双指针」。
- 有序数组上找配对:两数之和 II、三数之和、最接近的三数之和
- 原地删除 / 挪动元素且要求 O(1) 空间:删除有序数组重复项、移动零
- 链表判环、找中点、找倒数第 k 个节点(快慢指针)
- 回文判断:两端向中间逐字符比对
别和它们搞混
配套动画题:眼见为实
每道题都有逐步交互动画,看着数据动起来,比读十遍文字都快。
常见追问
对撞双指针为什么不会漏掉答案?
因为每次移动都伴随一个证明:被跳过的组合不可能比当前更优。以盛水为例,移动矮的那根柱子——高的那根不管配谁,容量都被矮边卡死,跳过它零损失。写对撞指针时说不出这个证明,多半方向就动错了。
双指针必须数组有序吗?
对撞指针要求有序或有等价的单调结构,否则「大了动哪边」没有依据;同向读写指针和快慢指针不需要有序,它们靠的是位置关系而不是大小关系。
什么时候用哈希表而不是双指针?
无序且要返回原始下标时(如两数之和 LC1),排序会打乱下标,哈希一遍扫完更直接;有序、或只要值不要下标、或要省空间时,双指针占优。