一. 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();
}