双指针算法
AcWing 799. 最长连续不重复子序列
输入样例:
5
1 2 2 3 5
输出样例:
3
代码中使用了桶排来标记每个数出现的次数:如数组a:1 2 2 2 4 4 5中s[1]=1,s[2]=3,s[4]=2,s[5]=1;也就是s[a[0]]=1,s[a[1]]=3,s[a[4]]=2,s[a[6]]=1。
#include <iostream>
using namespace std;
const int N = 100010;
int a[N],s[N];
int main()
{
int n,res=0;
cin>>n;
for(int i = 0; i < n; i++) cin>>a[i];
for(int i = 0,j = 0; i < n; i++)
{
s[a[i]]++;
while(s[a[i]]>1)
{
s[a[j]]--;//a[j]出现次数--,左端点右移
j++;
}
res = max(res,i-j+1);
}
cout<<res<<endl;
return 0;
}
AcWing 800. 数组元素的目标和
输入样例:
4 5 6
1 2 4 7
3 4 6 8 9
输出样例:
1 1
# include<iostream>
using namespace std;
const int N = 100010;
int a[N],b[N];
int n,m,k;
int main()
{
cin>>n>>m>>k;
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++)
{
while(j>=0&&b[j]+a[i]>k) j--;//b数组左移
if(a[i]+b[j]==k)//只有相加=k才会输出
printf("%d %d\n",i,j);
}
}
AcWing 2816. 判断子序列
输入样例:
3 5
1 3 5
1 2 3 4 5
输出样例:
Yes
参考自题解:https://www.acwing.com/solution/content/25506/
# include <iostream>
using namespace std;
const int N = 100010;
int a[N],b[N];
int n,m;
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<m;i++) cin>>b[i];
int i=0,j=0;
while(i<n&&j<m)
{
if(a[i]==b[j]) i++;
j++;
}
if(i==n)
puts("Yes");
else puts("No");
return 0;
}