主题:双指针算法 例题: 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 条评论

目前还没有评论...