算法基础:双指针算法
第一类
两个指针分别指向两个序列,例如归并排序
第二类
两个指针都指向一个序列,一个在区间的开头,另一个在区间的结尾,例如快排
双指针算法并非一定要用指针来表示
核心思想
先写出一种暴力做法,然后观察i与j之间是否存在关联,比如单调性,从而优化代码
for(int i = 0;i < n;++i) |
将上方原先O(n^2)的朴素算法优化为O(n)
通用模板
for(i = 0,j = 0;i < n; ++i) |
举例
|
例题
|
例题题解说明:
a和s分别作为存储序列和存储每个元素重复次数的数组,
在每次for循环记录每个重复元素次数
如果大于1则利用双指针使得 j 能够追上i,即双指针算法的原理
i作为结尾,j作为开头,让j不断自增直到i与j相等
**此时 j 就可以作为新子序列的首元素坐标 **
并利用res记录每次的子序列长度
整个题解可以理解为,用res记录子序列的长度,如果不出现重复元素则让res由i-j+1得出,如果出现重复元素,先记录新子序列的长度,再与上一个子序列进行比较,每次遍历都运算一次,时间复杂度就为O(n),最后快速得出最长连续子序列的长度
主要作用
优化运算量,时间复杂度
请给本菜鸟一个点赞和收藏吧
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 涅槃豆の博客!
评论