双指针:什么时候该想到“从两边逼近”
双指针看起来很常见,但很多人真正做题时并不会主动想到它。
双指针看起来很常见,但很多人真正做题时并不会主动想到它。
原因通常不是不会写,而是没有识别信号。
双指针到底在解决什么
它本质上是在利用一种关系:
- 两个位置之间存在可移动的边界
- 当前位置的选择会影响下一步搜索空间
- 通过移动指针,可以避免重复枚举所有组合
也就是说,双指针的价值不在“两个指针”本身,而在于:
你能不能通过移动边界来减少无效搜索。
什么时候应该优先想到双指针
我通常会先看这几个信号:
- 数据有序,或者排序后更容易处理
- 问题和“两个位置”之间的关系有关
- 暴力做法是两层枚举
- 每次移动一边可以排除一整批不可能情况
这几个条件一旦出现,双指针就值得优先试。
常见场景
相向双指针
从两边往中间逼近,常见于:
- 两数之和变体
- 容器盛水
- 回文判断
同向双指针
两个指针一起向前,常见于:
- 去重
- 原地删除
- 合并有序结构
为什么双指针容易写错
常见错误通常不是思路错误,而是边界处理不清楚:
- 指针什么时候移动
- 相等时该怎么处理
- 去重应该放在什么时候做
所以做完题后,最好复盘的不只是“这题用了双指针”,还要复盘:
- 为什么移动左边
- 为什么不是移动右边
- 这种移动到底排除了哪些情况
结论
双指针不是模板题型,而是一种利用边界收缩搜索空间的思维方式。
真正重要的不是记住写法,而是养成判断:
我能不能通过移动一个边界,排除整批不必要的枚举。