跳至主要內容

3.10 双指针


3.10 双指针

定义

双指针(Two Pointers):指的是在遍历元素的过程中,不是使用单个指针进行访问,而是使用两个指针进行访问,从而达到相应的目的。

  • 如果两个指针方向相反,则称为「对撞指针」;
  • 如果两个指针方向相同,则称为「快慢指针」;
  • 如果两个指针分别属于不同的数组 / 链表,则称为「分离双指针」。

在数组的区间问题上,暴力算法的时间复杂度往往是 O(n^2)。而双指针利用了区间「单调性」的性质,可以将时间复杂度降到 O(n)。

对撞指针

快慢指针

分离双指针

相关题目

数组双指针

  • 对撞指针
题号标题题解标签难度
0167两数之和 II - 输入有序数组open in new windowJSopen in new window数组 双指针 二分查找
0344反转字符串open in new windowJSopen in new window双指针 字符串
0345反转字符串中的元音字母open in new windowJSopen in new window双指针 字符串
0125验证回文串open in new windowJSopen in new window双指针 字符串
0011盛最多水的容器open in new windowJSopen in new window贪心 数组 双指针
0611有效三角形的个数open in new windowJSopen in new window贪心 数组 双指针 2+
0015三数之和open in new windowJSopen in new window数组 双指针 排序
0016最接近的三数之和open in new windowJSopen in new window数组 双指针 排序
0018四数之和open in new windowJSopen in new window数组 双指针 排序
0259较小的三数之和open in new windowJSopen in new window数组 双指针 二分查找 1+
0658找到 K 个最接近的元素open in new window数组 双指针 二分查找 3+
1099小于 K 的两数之和open in new window数组 双指针 二分查找 1+
0075颜色分类open in new window数组 双指针 排序
0360有序转化数组open in new window数组 数学 双指针 1+
0977有序数组的平方open in new window数组 双指针 排序
0881救生艇open in new window贪心 数组 双指针 1+
0042接雨水open in new windowJSopen in new window 数组 双指针 2+
0443压缩字符串open in new window双指针 字符串
  • 快慢指针
题号标题题解标签难度
0026删除有序数组中的重复项open in new windowJSopen in new window数组 双指针
0080删除有序数组中的重复项 IIopen in new windowJSopen in new window数组 双指针
0027移除元素open in new windowJSopen in new window数组 双指针
0283移动零open in new windowJSopen in new window数组 双指针
0845数组中的最长山脉open in new window数组 双指针 动态规划 1+
0088合并两个有序数组open in new windowJSopen in new window数组 双指针 排序
0719找出第 K 小的数对距离open in new window数组 双指针 二分查找 1+
0334递增的三元子序列open in new window贪心 数组
0978最长湍流子数组open in new window数组 动态规划 滑动窗口
剑指 Offer 21调整数组顺序使奇数位于偶数前面open in new windowJSopen in new window数组 双指针 排序
  • 分离双指针
题号标题题解标签难度
0350两个数组的交集 IIopen in new window数组 哈希表 双指针 2+
0925长按键入open in new window双指针 字符串
0844比较含退格的字符串open in new windowJSopen in new window 双指针 字符串 1+
1229安排会议日程open in new window数组 双指针 排序
0415字符串相加open in new window数学 字符串 模拟