双指针算法是一种利用单调性来降低运算量的算法。下面是例题:
最长连续不重复子序列:链接
#include<iostream>
using namespace std;
const int maxn=100000+5;
int num[maxn],cnt[maxn];
int main(void)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d",&num[i]);
}
int ans=0;
for(int i=0,j=0;i<n;i++)
{
cnt[num[i]]+=1;
while(cnt[num[i]]>1)
{
cnt[num[j]]-=1;
j++;
}
ans=max(ans,i-j+1);
}
printf("%d",ans);
return 0;
}
数组元素的目标和:链接
using namespace std;
const int maxn=100000+5;
int a[maxn],b[maxn];
int main(void)
{
int n,m,x,i,j;
scanf("%d %d %d",&n,&m,&x);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int i=0;i<m;i++)
{
scanf("%d",&b[i]);
}
for(i=0,j=m-1;i<n;i++)
{
while(j>=0&&a[i]+b[j]>x)
{
j--;
}
if(a[i]+b[j]==x)
{
break;
}
}
printf("%d %d",i,j);
return 0;
}
判断子序列:链接
#include<iostream>
using namespace std;
const int maxn=100000+10;
int a[maxn],b[maxn];
int main(void)
{
int n,m,i,j;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int i=0;i<m;i++)
{
scanf("%d",&b[i]);
}
for(i=0,j=0;i<m&&j<n;i++)
{
if(b[i]==a[j])
{
j++;
}
}
printf("%s",j==n?"Yes":"No");
return 0;
}