例题(最长连续不重复子序列)
双指针算法可以降低时间复杂度从O(n^2)降低到O(n)
朴素做法:O(n^2)
for(int i = 0; i < n; i++)
for(int j = 0; j <= i; j++)
if(check(j,i))
res = max(res,i - j + 1);
双指针算法:O(n)
for(int i = 0, j = 0; i < n; i++)
{
while(j <= i && check(j,i)) j++;
res = max(res,j - i + 1);
}
算法思想:
s为标记数组,维护一个区间 [l,r]
因为每次加上的是s[ a[r] ] 所以只要a[r]出现了两次
s[ a[r] ]即大于1 然后将左指针向右移动就可以保证区间[l,r]
是最长连续不重复子序列
例题AC代码:
#include <iostream>
using namespace std;
const int N = 100010;
int n,ans;
int a[N],s[N];
int main()
{
scanf("%d",&n);
for(int i = 0; i < n; i++) scanf("%d",&a[i]);
for(int l = 0,r = 0; r < n; r++)
{
s[a[r]]++;
while(s[a[r]] > 1)
{
s[a[l]]--;
l++;
}
ans = max(ans,r-l+1);
}
cout << ans << endl;
return 0;
}