1.自然语言描述
双指针算法并不是一种有确定模式的算法,而是一种思想/办法,它可以渗透进其他的具体算法中,而且往往起到了重要作用。一般情况下,双指针算法往往出现在对一个或两个序列的处理中(比如归并排序中,回归过程中两个子序列的合并就用到了双指针)
2.代码描述
题目:Acwing.799 最长连续不重复子序列题目链接
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN=1e5+10;
int n,s[MAXN],sta[MAXN];//sta保存序列中元素的出现次数,这里数的范围恰好和序列长度范围相同
int main(void)
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>s[i];
int ans=0;
for(int i=1,j=1;i<=n;i++){//i作为快指针,j作为慢指针
sta[s[i]]++;
while(sta[s[i]]>1){//s[i]曾经出现过了
sta[s[j]]--;//j要挪动到当前i的位置
j++;
}
ans=max(ans,i-j+1);//更新最大不重复子序列长度
}
cout<<ans<<endl;
return 0;
}
题目:Acwing.800 数组元素的目标和题目链接
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN=1e5+10;
int n,m,x,A[MAXN],B[MAXN];
int main(void)
{
cin>>n>>m>>x;
for(int i=0;i<n;i++)
cin>>A[i];
for(int i=0;i<m;i++)
cin>>B[i];
for(int i=0,j=m-1;i<n;i++){//由于A和B都是升序序列,所以为了最大程度降低时间复杂度,i从A的头(A的最小值)开始
//j从B的尾(B的最大值)开始,先让j尽量小,再让i增大试数
while(j>=0&&A[i]+B[j]>x)
j--;
if(A[i]+B[j]==x)
cout<<i<<' '<<j<<endl;
}
return 0;
}