two-pointer 算法
介绍
双指针算法是一种通过设置两个指针不断进行单向移动来解决问题的算法。
它包含两种形式:
两个指针分别指向不同的序列。比如:归并排序的合并过程。
两个指针指向同一个序列。比如:快速排序的划分过程。
一般更多使用、也更难想到的是第2种情况。
双指针算法最核心的用途就是优化时间复杂度。
【核心思想】:
原本两个指针是有 \(n^2\) 种组合,因此时间复杂度是 \(O(n^2)\)。
而双指针算法就是运用单调性使得指针只能单向移动,因此总的时间复杂度只有 \(O(2n)\),也就是 \(O(n)\)。
之所以双指针可以实现 [公式] 的时间复杂度是因为指针只能单向移动,没有指针的回溯,而且每一步都会有指针移动。
而朴素的 \(O(n^2)\) 算法的问题就在于指针经常回溯到之前的位置。
双指针算法的模板一般都可以写成下面的形式(模板):
for (int i = 0, j = 0; i < n; i++)
{
while (j < i && check(i, j)) j++;
// 每道题目的具体逻辑
}
因为双指针算法是一种优化时间复杂度的方法,所以我们可以首先写出最朴素的两层循环的写法。
然后考虑题目中是否具有单调性。
即当其中一个指针 [公式] 向后移动时,在希望得到答案的情况下,另一个指针 [公式] 是不是只能向着一个方向移动。
如果是,说明题目具有单调性,可以通过双指针算法优化。