two-pointer 算法
介绍
双指针算法是一种通过设置两个指针不断进行单向移动来解决问题的算法。
它包含两种形式:
两个指针分别指向不同的序列。比如:归并排序的合并过程。
两个指针指向同一个序列。比如:快速排序的划分过程。
一般更多使用、也更难想到的是第2种情况。
双指针算法最核心的用途就是优化时间复杂度。
【核心思想】:
原本两个指针是有 种组合,因此时间复杂度是 。
而双指针算法就是运用单调性使得指针只能单向移动,因此总的时间复杂度只有 ,也就是 。
之所以双指针可以实现 [公式] 的时间复杂度是因为指针只能单向移动,没有指针的回溯,而且每一步都会有指针移动。
而朴素的 算法的问题就在于指针经常回溯到之前的位置。
双指针算法的模板一般都可以写成下面的形式(模板):
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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步