在这片梦想之地,不堪回首的过去像泡沫一样散去,不愿面对的明天也永远不会到来,人们为何选择沉睡?是因为害怕从梦中醒来。|

PassName

园龄:3年1个月粉丝:32关注:16

two-pointer 算法

介绍

双指针算法是一种通过设置两个指针不断进行单向移动来解决问题的算法。

它包含两种形式:

两个指针分别指向不同的序列。比如:归并排序的合并过程。
两个指针指向同一个序列。比如:快速排序的划分过程。
一般更多使用、也更难想到的是第2种情况。

双指针算法最核心的用途就是优化时间复杂度。

【核心思想】:

原本两个指针是有 n2 种组合,因此时间复杂度是 O(n2)
而双指针算法就是运用单调性使得指针只能单向移动,因此总的时间复杂度只有 O(2n),也就是 O(n)
之所以双指针可以实现 [公式] 的时间复杂度是因为指针只能单向移动,没有指针的回溯,而且每一步都会有指针移动。

而朴素的 O(n2) 算法的问题就在于指针经常回溯到之前的位置。

双指针算法的模板一般都可以写成下面的形式(模板):

for (int i = 0, j = 0; i < n; i++)
{
    while (j < i && check(i, j)) j++;

    // 每道题目的具体逻辑
}

因为双指针算法是一种优化时间复杂度的方法,所以我们可以首先写出最朴素的两层循环的写法。

然后考虑题目中是否具有单调性。

即当其中一个指针 [公式] 向后移动时,在希望得到答案的情况下,另一个指针 [公式] 是不是只能向着一个方向移动。

如果是,说明题目具有单调性,可以通过双指针算法优化。

本文作者:PassName

本文链接:https://www.cnblogs.com/spaceswalker/p/16226583.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   PassName  阅读(53)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起