双指针算法

最大不重复数组

学习了新的语法,主要是vector<int>
emm,这个的原理很简单,就是用左右两个指针和维护一个最后出现位置数组。如果发现最后出现位置不是-1,那么去和左指针比较,如果左指针小就更新。

#include<iostream>
#include<vector>
using namespace std;

void getlong(vector<int> & a){
    int n = a.size();
    int l = 0; int r = 0;
    vector<int> lastloc(100001,-1);
    int maxlen = 0;
    
    for (r = 0; r < n; r ++ ){
            if(lastloc[a[r]]!=-1){
                l=max(l,lastloc[a[r]]+1);
            }
            lastloc[a[r]] = r;
            maxlen = max(maxlen,r-l+1);
    }
    cout << maxlen;
    
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
    vector<int> a(n);
    
    for (int i = 0; i < n; i ++ ){
        cin>>a[i];
    }
    
    getlong(a);
    
    return 0;
}

目标数组和

#include<iostream>
#include<vector>
#include<unordered_map>
using namespace std;


void query(vector<int> &A, vector<int> &B, int x){
    int n = A.size();
    int m = B.size();
    //这道题目纯自己想的,思路是维护一个位置数组
    //如果记录对应数字的位置,到时候做差直接查询,就不用一个一个比较了。
    unordered_map<int,int> Bloc;
    for (int i = 0; i < m; i ++ ){
        Bloc[B[i]] = i;
    }
    //以上消耗的是n+m
    //接下来直接开查
    int diff = 0;
    for (int i = 0; i < n; i ++ ){
        diff = x - A[i];
        if(Bloc.find(diff)!=Bloc.end()){
            cout<< i << " " << Bloc[diff]<<endl;
            return;
        }
    }


}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n,m,x;
    cin >> n >> m >> x;
    vector<int> A(n);
    vector<int> B(m);
    for (int i = 0; i < n; i ++ ){
        cin >> A[i];
    }
    for (int i = 0; i < m; i ++ ){
        cin >> B[i];
    }
    query(A,B,x);
    return 0;
}

理论上应该用双指针的误打误撞用哈希表解决了,方法是直接存储对应数字的位置,如果存在且是对应的差,就拿取。
正解是两个指针一个是i从开头开始,一个是j从结尾开始,大了,j变小,小了i变大。下一题目用哈希表糊弄不过去了。

子序列

两个指针看着,小的序列如果指到最后那么说明就是。

#include <vector>
#include <iostream>
#include <unordered_map>
using namespace std;

int main()
{
    int n,m;
    cin >> n >> m;
    vector<int> a(n);
    vector<int> b(m);
    for (int i = 0; i < n; i ++ ) cin>>a[i];
    for (int i = 0; i < m; i ++ ) cin>>b[i];
    
    int p,q;
    p = 0; q=0;
    while(q<m&&p<n){
        if(b[q]==a[p]){
            p++;
            q++;
        }else q++;
    }
    
    if(p==n) cout << "Yes";
    else cout << "No";
    
    return 0;
}
posted @ 2025-07-23 18:04  .N1nEmAn  阅读(7)  评论(0)    收藏  举报