Skip to content

Two Pointers

双指针是一种灵活的思想和技巧,可以单独使用也可以和其他算法一起结合使用。双指针同时使用两个指针,在不同数据结构上(数组,链表,树,图)中辗转腾挪,同向移动,反向移动,快慢速等等来maintain我们的状态和信息.

常见的分成两类:

  • 同向指针(两个指针步长不同), line sweep, sliding window, Floyd's Cycle Detection (快慢指针), 单调队列,单调栈
    • 快慢指针:
      • 找中点,
      • 判断是否有环 Floyd's Cycle Detection
    • sliding window:
      • 双指针同时scan, 一个指针用于扩展窗口,一个指针用于收缩窗口. 扩展收缩的条件取决于题目的需求,常见维护的信息有:
        • 一个窗口内的信息, like rolling sum
        • 指针上的信息,如记录最大值,最小值
      • 用于解决subsequence(subarray或者substring问题). 对于subarray, 只能用于解决positive array, 因为得保证move left pointer会减少,move right pointer会增加.
    • on sorted array:
      • 如果给定的条件是两个sorted array, 你可以用双指针在两个数组上同时移动,比如merge two sorted array, find common elements in two sorted array等等.
  • 反向指针(两个指针从两端向中间移动), 比如binary search.
    • binary search: 用于在有序数组中查找元素,时间复杂度为O(logn). 两指针在两端,往中间移动。

相关问题

number 类型 description solution
680 valid palindrome II 反向指针 - solution
408 valid word abbreviation 同向双指针on two array 注意判定leading zero and how to handle digits solution
253 meeting rooms II 双指针 - solution
1570 Dot Product of Two Sparse Vectors 同向双指针, on two sorted array 利用list of tuple (index,value)储存non-zero elements, 然后双指针on two sorted array,进行dot product计算。好题! solution
42 Trapping Rain Water 双指针 - solution
141 linked list cycle 双指针, 快慢指针 - solution
142 linked list cycle II 双指针, 快慢指针 - solution
340 Longest Substring with At Most K Distinct Characters 同向指针, sliding window 根据条件move left pointer, 维护一个freq map. 注意当freq = 0时需要移除key solution
15 3sum 双指针, sliding window - solution
704 Binary Search 双指针, binary search - solution
887 Super Egg Drop 双指针, - solution

Reference