双指针
- 双指针(Two Pointers)
双指针(Two Pointers)
- 对撞指针(Opposite Direction Two Pointers):
- 对撞指针从两端向中间移动,一个指针从最左端开始,另一个最右端开始,然后逐渐往中间逼近
- 使用场景:
- 有序数组中寻找两数之和
- 盛最多水的容器
- 判断回文字符串/链表
- 特点:常用于有序数组,时间复杂度为 O(n) 或 O(n^2)
- 对撞指针的终止条件一般是两个指针相遇或者错开(也可能在循环内部找到结果直接跳出循环)
- left == right (两只指针指向同一位置)
- left > right (两个指针错开)
- 快慢指针(Same Direction/SIow-Fast Pointers):又称龟速赛跑算法,基本思想是使用两个移动速度不同在数组或链表等序列结构上移动.
- 两个指针从同一个方向出发,一个走快点,一个走慢一点
- 使用场景:
- 删除倒数第N 个节点
- 检测链表是否有环
- 找链表中点
- 会问链表判断
- 特点:适合链表或需要跳跃处理的问题
- 对于处理环形链表或数组非常有用
- 问题中出现循环往复的情况时,也可以考虑使用快慢指针指针思想
- 滑动窗口(SIiding Window)
- 定义:也可以看做一种双指针,但强调 “窗口” 的概念。
- 使用场景:
- 最长无重复子串
- 子数组之和等于目标值
- 字符串包含所有字符串的最小子串
- 特点:两个指针一前一后控制窗口范围,适用于连续子数组/子串问题
- 归并排序中的双指针(Merge Two Sorted Arrays)
- 定义:在归并排序或合并两个有序数组时使用双指针进行合并
- 使用场景:
- 合并两个有序数组
- 合并两个有序链表
类型 | 移动方向 | 典型应用场景 | 时间复杂度 |
---|---|---|---|
对撞指针 | 对向 | 两数之和、盛水容器、三数之和 | O(n) ~ O(n²) |
快慢指针 | 同向 | 链表找环、删除倒数节点 | O(n) |
滑动窗口 | 同向扩展窗口 | 最长子串、子数组和 | O(n) |
归并双指针 | 同向 | 合并有序数组/链表 | O(n + m) |