算法学习——双指针算法(最长连续不重复子序列)
Posted flydoggie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法学习——双指针算法(最长连续不重复子序列)相关的知识,希望对你有一定的参考价值。
双指针算法本质上就是将具有单调性的算法复杂度为O(N^2)的朴素算法通过双指针优化到O(n)的一种优化方法。是一种十分常用的算法。
设计双指针算法我们一般先写出它的朴素算法,然后按照模板:
for( int i = 0, j = 0 ; i < n ; i ++) { //check()是按照题目逻辑的判断函数 while( j <= i && check() ){ //不满足时 j ++; } //此处是按照题目逻辑的解答过程。 }
将其转换为双指针算法。
例题:最长连续不重复子序列
题解代码:
#include<iostream> using namespace std; const int N = 1000010; int n; int a[N]; int cnt[N]; int main(){ int res = 0; scanf("%d",&n); for(int i = 0 ; i < n ; i ++ ) scanf("%d",&a[i]); for(int i = 0, j = 0 ; i < n ; i ++ ){ cnt[a[i]]++; while( cnt[a[i]] > 1 ){ cnt[a[j]]--; j++; } res = max(res , i - j + 1); } printf("%d ",res); return 0; }
以上是关于算法学习——双指针算法(最长连续不重复子序列)的主要内容,如果未能解决你的问题,请参考以下文章