很多刚入门学算法的小白,都会卡在同一个死胡同:
做题只会暴力两层循环,写出来代码能跑,但一提交就超时、超时、还是超时。
看着别人一行简洁代码轻松通过,自己却写一堆冗余逻辑干着急,越刷越自卑。
其实不用慌,算法入门根本不用啃复杂理论、不用死记硬背公式。今天给大家拆解的双指针算法,就是算法界的「通用提速神器」。
简单上手、适用性极强、面试高频必考,吃透它,你的刷题速度直接翻倍,从此告别超时扣分。
全文无晦涩公式、无复杂前置知识,纯小白友好,建议先收藏,慢慢吃透!
先聊大白话:双指针到底是干啥的?
先抛开所有专业术语,我们用生活场景类比,一秒读懂核心逻辑。
假设你和朋友一起逛一排整齐的货架,想快速找出符合要求的两件商品:
-
暴力做法(笨办法):你从头挨个看第一件,看完之后,再从头挨个比对第二件,来回反复跑好几遍,费时又费力,对应代码里的两层循环,耗时拉满。
-
双指针做法(聪明办法,多一个朋友来帮你从后往前找第!二!件):你站在货架开头,朋友站在货架末尾,两个人朝着中间慢慢走,一边走一边判断条件,只走一趟就能搞定所有查找,全程只遍历一遍,省时又高效。
这就是双指针的核心本质:用两个位置标记(指针),代替两层循环,一趟遍历解决问题,直接把算法速度拉满。
放在编程里:
数组 / 字符串里,不用写 for 循环嵌套,只用定义两个下标变量,一个往前跑、一个往后跑,或者两个一起往前跑,边走边判断,问题直接解决。
为什么一定要学双指针?3个硬核理由,小白必看
1. 完美解决小白最大痛点:超时
两层暴力循环:数据一多,运行时间直接暴涨,系统判定超时,直接扣分挂科。
双指针:无论数据量变大多少,几乎都是匀速运行,稳稳通过所有时间限制,零超时风险。
2. 适用场景超级多,性价比拉满
数组、字符串、有序序列、区间查找、去重、排序后匹配……
算法入门80%的简单、中等题型,都能用双指针轻松破解,学会一个,通吃大半基础题库。
3. 面试必考,面试官最爱问基础思想
面试官不纠结你复杂高阶算法,反而最爱考双指针:
只要你能说清双指针核心思想、写对基础模板,直接加分,妥妥的入门加分王牌技能。
双指针就两种套路!小白死记这两类,够用一整年
不用记五花八门的复杂题型,不用背零散代码。所有双指针题目,只分两大类,吃透就够用。
第一类:对撞指针(左右碰头,往中间走)🔥 高频必考
适用场景:数组已经提前排好序、找两个数求和、判断回文字符串、区间匹配类问题。
核心动作:
-
左指针:卡在最左边,从头开始往右挪
-
右指针:卡在最右边,从尾开始往左挪
-
每次判断当前两个位置的数字是否符合要求
-
符合条件就记录答案,不符合就移动对应指针,直到两个指针碰到一起,结束遍历
大白话口诀:两头开工,往中间靠,一边比对,一边收束。
第二类:快慢指针(一前一后,同向赶路)🔥 刷题刚需
适用场景:数组原地去重、删除指定元素、链表找环、统计有效元素个数、不额外占用内存的场景。
核心动作:
-
慢指针:负责留守,标记有效数据的最后一个位置,稳稳不动或少动
-
快指针:负责冲锋,从头到尾快速遍历所有元素,挨个筛查判断
-
快指针找到合格元素,就交给慢指针收下,不合格直接跳过,不占用额外空间
大白话口诀:快的往前探路,慢的留守收货,原地整理数组,省钱又省空间。
实战举例1:对撞指针,小白一看就懂(有序数组两数求和)
题目场景:给你一个从小到大排好序的数组,再给一个目标和,快速找出两个相加刚好等于目标数的数字位置。
❌ 小白暴力写法(除了刚开始不会这个思想但想解题以外,其他时候千万别用)
写两层嵌套循环,挨个两两组合相加比对。数据量大一点,直接超时报废,白写半天白费力气。
✅ 双指针聪明写法(一遍跑完,零超时)
-
左指针站开头,右指针站末尾,固定初始位置;
-
计算左右两个指针指向数字的总和;
-
总和刚好等于目标值:直接记录答案,结束查找;
-
总和太小:说明左边数字不够大,左指针往右挪一点,增大总和;
-
总和太大:说明右边数字太大,右指针往左挪一点,减小总和;
-
循环往复,直到找到答案,全程只走一遍数组。
核心优势:不用重复比对、不用额外空间,逻辑简单好记,代码十几行搞定,稳过所有测试用例。
实战举例2:快慢指针,原地数组去重(面试常考)
题目场景:有序数组里有一堆重复数字,不允许新开数组,必须在原数组上把重复数字删掉,只保留不重复的数,最后统计有效数字个数。
✅ 快慢指针思路
-
慢指针守在有效数字最后一位,负责留存合格数据;
-
快指针一路往前跑,挨个检查后面的数字;
-
快指针发现数字和慢指针数字不一样:说明是全新有效数字,慢指针往前走一步,收下这个新数字;
-
快指针发现数字和慢指针数字一样:判定为重复垃圾数据,直接跳过不理会;
-
快指针跑完整个数组,慢指针所在位置前面,全是去重后的干净有效数组。
不用新开内存、不用复杂判断、不用嵌套循环,原地搞定去重,面试官看了都点赞。
小白必避!双指针3个高频坑点(避开少走半年弯路)
坑点1:数组没排序,乱用对撞指针
对撞指针必须依赖有序数组!数组乱序直接左右碰头比对,逻辑直接错乱,答案全错,白忙活一场。无序数组优先选快慢指针,或先排序再用对撞指针。
坑点2:指针移动顺序写反,直接漏答案
求和偏小就右移左指针,求和偏大就左移右指针,千万别写反。新手最容易手抖写错,直接导致找不到正确答案,排查半天找不到问题。
坑点3:边界不设防,数组直接越界报错
一定要加循环条件:左指针 < 右指针。一旦两个指针碰头,立刻停止循环。不设防就会出现指针跑出数组范围,程序直接崩溃报错。
全文总结:小白记住这3句话,吃透双指针
-
双指针就是用两个标记位置,代替两层循环,核心提速降耗时,专治算法超时难题;
-
只会两类模板就够用:有序找数用对撞指针,原地改数组用快慢指针,全覆盖入门题型;
-
先判断条件、再移动指针、守好边界不越界,零基础也能一次性写对代码。
算法不用死磕天赋,不用死背难题,选对方法,最关键的是能先独立模仿出前人智慧就能轻松入门。
