AcWing 双指针算法打卡

799. 最长连续不重复子序列

https://www.acwing.com/problem/content/801/

#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
const int Maxn=1e5+5;
int a[Maxn];
int n;
int s[Maxn];//本质Hash表
int main(){
    cin>>n;
    int res=0;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    for(int i=0,j=0;i<n;i++){
        s[a[i]]++;
        while(j<i && s[a[i]]>1) s[a[j++]]--;//前面出现次数超过一次,就需要缩短后面的长度
        res=max(res,i-j+1);
    }
    cout<<res<<endl;
  return 0;
}
//  freopen("testdata.in", "r", stdin);

800. 数组元素的目标和

https://www.acwing.com/problem/content/802/

#include <iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<queue>
#include<stack>
#include<cstring>
using namespace std;
int n,m,x;
const int Maxn=1e5+5;
long long a[Maxn];
long long b[Maxn];
int main(){
    cin>>n>>m>>x;
    for(int i=0;i<n;i++){
        scanf("%ld",a+i);
    }
    for(int i=0;i<m;i++){
        scanf("%ld",b+i);
    }
    int j=m-1;
    for(int i=0;i<n;i++){
        while(j>0 && a[i]+b[j]>x) j--;
        if(a[i]+b[j]==x) cout<<i<<" "<<j;
    }

  return 0;
}


//  freopen("testdata.in", "r", stdin);

2816. 判断子序列

https://www.acwing.com/problem/content/2818/

#include <iostream>
#include <cstring>

using namespace std;

const int N = 100010;

int n, m;
int a[N], b[N];

int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
    for (int i = 0; i < m; i ++ ) scanf("%d", &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;
}

posted @ 2021-03-23 19:23  一个经常掉线的人  阅读(54)  评论(0)    收藏  举报