什么是两个指针
两个指针指的是在解题过程中我们会先声明两个指针left和right,分别指向目标(通常是数组)的两点(通常是同一点或者数组的两端),指针如何移动,哪个指针应该移动通常是由两个指针指向的点所决定的。不断移动两个指针直到某个条件不满足为止(比如left > right
或者right >= length
等等)。
什么情况下会用到两个指针
两个指针一般分为以下几种情况:
- 对撞型指针。即两个指针分别从两头向中间聚集,当两个指针相遇时结束。 例如:Trapping Rain Water,Container With Most Water,经典题 3Sum。
- 同向型指针。即两个指针的行动方向相同,当某个指针超出边界或相遇时结束。 这种类型也可以细分为以下两种小类: (1) 窗口型。通常是string的substring。 例如:Longest Substring Without Repeating Characters,Minimum Size Subarray Sum,Minimum Window Substring,Longest Substring with At Most K Distinct Characters。 (2) 追赶型。两个指针一前一后互相追赶,指针的移动速度不一定相同。 例如:Move Zeroes,Linked List Cycle II(这道题很有意思)。
- 并行型指针。上面说的都是同一个数组存在两个指针,这里则不一样。并行型指针通常是指有两个数组,每个数组分别有一个指针不断移动,直到某个条件满足时结束。 例如:Intersection of Two Arrays。