双指针的朴素做法(暴力枚举) 时间复杂度O(n*n)
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
.......
双指针算法则是运用题目内部的具体逻辑将上述算法的复杂度降到O(n),
通用模板如下:
for(int i=0,j=0;i<n;i++)
{
while(j<i&&check(i,j)) j++;
......
}
最长不重复连续子序列
朴素做法如下:O(n*n)
for(int i=0;i<n;i++) //i 为子序列右端点
for(int j=0;j<=i;j++)
if(check(j,i))
{
res=max(res,i-j+1);
}
简化后做法:
#include<iostream>
using namespace std;
const int N=100010;
int n;
int a[N],s[N];
int main()
{
cin >> n;
for(int i=0;i<n;i++) cin >> a[i];
int res=0;
for(int i=0,j=0;i<n;i++)
{
s[a[i]]++;
while(s[a[i]]>1)
{
s[a[j]]--;
j++;
}
res=max(res,i-j+1);
}
printf("%d",res);
return 0;
}