- C++
主题:双指针算法
- 2023-12-30 18:08:12 @
主题:双指针算法 例题: 1、最长连续不重复子序列(滑动窗口双指针)
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int a[N],s[N],n,ans;
int main(){
cin>>n;
for(int i=0;i<=n-1;i++)cin>>a[i];
for(int i=0,j=0;i<=n-1;i++){
s[a[i]]++;
while(s[a[i]]>1){
s[a[j]]--;
j++;
}
ans = max(ans,i-j+1);
}
cout<<ans;
return 0;
}
2、数组元素的目标和(碰撞双指针)
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n,m,x,a[N],b[N];
int main(){
cin>>n>>m>>x;
for(int i=0;i<=n-1;i++)cin>>a[i];
for(int i=0;i<=m-1;i++)cin>>b[i];
for(int i=0,j=m-1;i<=n-1;i++){
while(j>=0&&a[i]+b[j]>x)j--;
if(a[i]+b[j]==x){
cout<<i<<" "<<j;
return 0;
}
}
}
3、判断子序列(双指针综合)
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int n,m,a[N],b[N];
int main(){
cin>>n>>m;
for(int i=0;i<=n-1;i++)cin>>a[i];
for(int i=0;i<=m-1;i++)cin>>b[i];
int i,j;
for(i=0,j=0;i<=0;i++){
if(a[j]==b[i]){
j++;
}
}
if(j==n){
cout<<"yes";
}else cout<<"no";
return 0;
}
重点: 1、双指针,一般设置的是左指针和右指针,可以用i和j,也可以用left和right。 2、指针应该根据题目进行相应的移动,要注意指针的隐含条件。
0 条评论
目前还没有评论...