1,回文数组双指针算法(字符串等皆适用)
#include<iostream>
using namespace std;
const int N = 1e5+10;
int main() {
bool flag = 1;
int n;
int a[N];
cin>>n;
for(int i = 1;i<=n;i++) {
cin>>a[i];
}
int i = 1,j = n;
while(i<=j) {
if(a[i]!=a[j]) flag = 0;
i++,j--;
}
if(flag) cout<<"true"<<endl;
else cout<<"no"<<endl;
return 0;
}
2,最长连续不重复序列(双指针)
#include<iostream>
using namespace std;
const int N = 1e5+10;
int main() {
int res = 0;
int n;
cin>>n;
int a[N],b[N];
for(int i = 0;i<n;i++) cin>>a[i];
for(int i = 0,j = 0;i<n;i++) {
b[a[i]]++;
while(j<i&&b[a[i]]>1) b[a[j++]]--;
res = max(res,i-j+1);
}
cout<<res<<endl;
return 0;
}
3,求数组中目标和的下标
#include<iostream>
using namespace std;
const int N = 1e5+10;
int a[N],b[N];
int main() {
int n,m,x;
cin>>n>>m>>x;
for(int i = 0;i<n;i++) scanf("%d",&a[i]);
for(int j = 0;j<m;j++) scanf("%d",&b[j]);
for(int i = 0,j = m-1;i<n;i++) {
while(j>=0&&a[i]+b[j]>x) j--;
if(a[i]+b[j]==x) {
printf("%d %d",i,j);
return 0;
}
}
return 0;
}
4,判断子序列
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e5+10;
int a[N],b[N];
int main() {
int n,m;
cin>>n>>m;
for(int i = 0;i<n;i++) cin>>a[i];
for(int j = 0;j<m;j++) cin>>b[j];
int j = 0,i = 0;
while(i<n&&j<m) {
if(a[i]==b[j]) i++;
j++;
}
if(i==n) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
}
备注(i<n的特判是因为数组未初始化,只进行了覆盖值)