双指针算法模板题
思路:
1.动态判断一个区间的数字是否有重复的,因为输入的数字不是很大,可以开一个数组进行标记
2.i指向序列的末尾,j指向序列的开头,只要不出现重复的i就一直向后走
当出现重负的,j向后走,数据移除,st数组要变化,当s[a[j]!>1是 就说明重复的那个元素已经被移除了。
C++ 代码
#include<iostream>
#include<cstring>
using namespace std;
const int N=1e5+10;
int a[N];
int n;
int st[N];//动态地判断序列j到i中有无重复出现的数字
int main()
{
cin>>n;
for(int i=0;i<n;i++)scanf("%d",&a[i]);
int res=0;
for(int i=0,j=0;i<n;i++){
st[a[i]]++;//a[i]进入区间中
while(st[a[i]]>1){
st[a[j]]--;
j++;
}
res=max(res,i-j+1);
}
cout<<res<<"\n";
return 0;
}