文章目录
双指针的基本思想
双指针是用于线性序列的一种思想,线性序列包括数组、字符串和链表。当用于数组和字符串时,双指针一般为两个不同的下标;当用于链表时,双指针一般为两个不同的结点。
双指针的适用场景包括同一个线性序列和两个不同的线性序列,取决于具体问题。
双指针的分类
根据双指针的移动方向是否相同,双指针可以分成同向指针和反向指针两类。
同向指针
同向指针为双指针移动方向相同的情形。常见的同向指针包括同速指针和快慢指针。
同速指针为双指针按照相同速度同时移动,指针之间的距离固定的情形。同速指针的典型例子包括寻找链表的倒数第 k k k 个结点。
快慢指针为双指针按照不同速度移动的情形。快慢指针可以用于数组和链表,数组的典型例子包括删除重复元素以及删除特定值的元素,链表的典型例子包括寻找链表的中点、判断链表中是否有环以及寻找链表中的环的入口。
反向指针
反向指针为双指针移动方向相反的情形。反向指针的常见做法是双指针从序列的首尾开始相向移动,直到相遇。
反向指针的典型例子包括判断字符串是否为回文串、反转字符串、在有序数组中寻找元素和等于目标值的两个元素。
双指针和滑动窗口的区别
双指针和滑动窗口较为相似,但是具体做法和适用场景有所不同。
滑动窗口是双指针的特例,适用于窗口两端同向移动且需要考虑窗口内部所有元素的场景。
双指针只需要考虑指针处的元素,不需要考虑指针之间的元素,且指针的移动方向可以是同向或反向。
目录
- 双指针题目:反转字符串
- 双指针题目:合并两个有序数组
- 双指针题目:按奇偶排序数组
- 双指针题目:按奇偶排序数组 II
- 双指针题目:反转字符串 II
- 双指针题目:反转字符串中的单词 III
- 双指针题目:反转字符串中的元音字母
- 双指针题目:仅仅反转字母
- 双指针题目:验证回文串
- 双指针题目:验证回文串 II
- 双指针题目:两数之和 II - 输入有序数组
- 双指针题目:删除有序数组中的重复项
- 双指针题目:移除元素
- 双指针题目:移动零
- 双指针题目:两个数组的交集
- 双指针题目:两个数组的交集 II
- 双指针题目:两数之和 IV - 输入二叉搜索树
- 双指针题目:判断子序列
- 双指针题目:盛最多水的容器
- 双指针题目:K 和数对的最大数目
- 双指针题目:三数之和
- 双指针题目:最接近的三数之和
- 双指针题目:四数之和
- 双指针题目:找到 K 个最接近的元素
- 双指针题目:数组中的 k 个最强值
- 双指针题目:煎饼排序
- 双指针题目:删除有序数组中的重复项 II
- 双指针题目:复写零
- 双指针题目:有效三角形的个数
- 双指针题目:适龄的朋友
- 双指针题目:区间列表的交集
- 双指针题目:压缩字符串
- 双指针题目:长按键入
- 双指针题目:下一个排列
- 双指针题目:三数之和的多种可能
- 双指针题目:供暖器
- 双指针题目:推多米诺
- 双指针题目:神奇字符串
- 双指针题目:将数组分成三个子数组的方案数
- 双指针题目:区间子数组个数
- 双指针题目:分割两个字符串得到回文串
- 双指针题目:找出第 K 小的数对距离
- 双指针题目:满足条件的子序列数目
- 双指针题目:删除最短的子数组使剩余数组有序
- 双指针题目:按字典序排在最后的子串