跳至主要內容

3.10 双指针


3.10 双指针

定义

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

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

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

对撞指针

快慢指针

分离双指针

相关题目

数组双指针

  • 对撞指针
题号标题题解标签难度
167两数之和 II - 输入有序数组open in new window[✓]数组 双指针 二分查找
344反转字符串open in new window[✓]双指针 字符串
345反转字符串中的元音字母open in new window[✓]双指针 字符串
125验证回文串open in new window[✓]双指针 字符串
11盛最多水的容器open in new window[✓]贪心 数组 双指针
611有效三角形的个数open in new window[✓]贪心 数组 双指针 2+
15三数之和open in new window[✓]数组 双指针 排序
16最接近的三数之和open in new window[✓]数组 双指针 排序
18四数之和open in new window[✓]数组 双指针 排序
259较小的三数之和 🔒open in new window[✓]数组 双指针 二分查找 1+
658找到 K 个最接近的元素open in new window数组 双指针 二分查找 3+
1099小于 K 的两数之和 🔒open in new window数组 双指针 二分查找 1+
75颜色分类open in new window[✓]数组 双指针 排序
360有序转化数组 🔒open in new window数组 数学 双指针 1+
977有序数组的平方open in new window数组 双指针 排序
881救生艇open in new window贪心 数组 双指针 1+
42接雨水open in new window[✓] 数组 双指针 2+
443压缩字符串open in new window[✓]双指针 字符串
  • 快慢指针
题号标题题解标签难度
26删除有序数组中的重复项open in new window[✓]数组 双指针
80删除有序数组中的重复项 IIopen in new window[✓]数组 双指针
27移除元素open in new window[✓]数组 双指针
283移动零open in new window[✓]数组 双指针
845数组中的最长山脉open in new window[✓]数组 双指针 动态规划 1+
88合并两个有序数组open in new window[✓]数组 双指针 排序
719找出第 K 小的数对距离open in new window数组 双指针 二分查找 1+
334递增的三元子序列open in new window[✓]贪心 数组
978最长湍流子数组open in new window数组 动态规划 滑动窗口
剑指 Offer 21调整数组顺序使奇数位于偶数前面open in new window[✓]数组 双指针 排序
  • 分离双指针
题号标题题解标签难度
350两个数组的交集 IIopen in new window数组 哈希表 双指针 2+
925长按键入open in new window双指针 字符串
844比较含退格的字符串open in new window[✓] 双指针 字符串 1+
1229安排会议日程 🔒open in new window数组 双指针 排序
415字符串相加open in new window[✓]数学 字符串 模拟