[两个指针] (Two Pointer)
两个指针的题目主要分成三种情况:
a.对撞型
2Sum 类
例题: Trapping Water
一个指针i指向数组头,一个指针j指向数组尾。1234567while i != j:if num[i] < num[j]:i += 1elif num[i] > num[j]:j -= 1else:i += 1Partition类
例题: 将一个数组分成两部分,一部分小与k,一部分大于k
一个指针i指向数组头,一个指针j指向数组尾。i表示在i之前的元素都小于k,j表示在j之后的元素都大于k。123456789while i != j:while num[i] < k:i += 1while num[j] > k:j -= 1if i > j:breakelse:swap(i, j)
总结
通过对撞型指针优化算法,根本上其实要证明不用扫描多余状态
b.前向型
窗口类
例题: Minimum Window Substring
窗口类指针模板j12345678j = 0for i in xrange(n):while j < n:if 满足条件:j += 1更新状态else 不满足条件:break快慢类
两个指针i, j的pace不同,可以用来探测一个链表是否有回路
总结
窗口类的问题根本上其实也是要证明不用扫描多余状态
快慢类的问题感觉和经常见的烧蜡烛的那种智力题很像。或者是环绕一圈来找list有没有cycle。
c.两个数组,两个指针
- 并行
例题: Merge Two Sorted Array
单纯的是否两个指针