一. AcWing799_最长连续不重复子序列

二. 理论

  • 算法原理:双指针算法通常使用两个指针来遍历数组或链表,从而减少嵌套循环的使用。

  • 时间复杂度:在双指针算法中,每个指针在最坏情况下最多遍历整个数组或链表一次,指针的移动通常是线性的,因此时间复杂度是 O(n)。


  • 本题答案

三. 代码

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=1e5+10;

int n;
int a[N];

//双指针类
class DualPointers
{
private:
    int l, r;
    int ans, cnt[N];

public:
    static void initIO()
    {
        // 关闭输入输出缓存,使效率提升
        ios::sync_with_stdio(false);
        // 解除cin和cout的默认绑定,来降低IO的负担使效率提升
        cin.tie(nullptr);
        cout.tie(nullptr);
    }

    DualPointers(int l_, int r_, int ans_):l(l_), r(r_), ans(ans_)
    {
        fill(cnt, cnt+N, 0);
    }

    int work()
    {
       for(int i=l, j=r;j<n;++j)
       {
           ++cnt[a[j]];
           while(cnt[a[j]]>1)
           {
               --cnt[a[i]];
               ++i;
           }
           ans=max(ans, j-i+1);
       }

        return ans;
    }
};

int main()
{
    DualPointers::initIO();

    cin>>n;
    for(int i=0;i<n;++i)
        cin>>a[i];

    DualPointers dualPointers(0, 0, 1);
    cout<<dualPointers.work();
}