原题题目
代码实现
#include<iostream>
using namespace std;
const int N=100010;
int n;
int a[N],s[N];
int main()
{
cin >> n;
for(int i=0;i<n;i++)cin >> a[i];
int res=0;
for(int i=0,j=0;i<n;i++)
{
s[a[i]]++;
while(s[a[i]]>1)
{
s[a[j]]--;
j++;
}
res=max(res,i-j+1);
}
cout << res<<endl;
return 0;
}
类似的用法
在刚开始学的快排和归并中都用到了这样的思想。
定义两个变量,把他想象成两个指针,分别遍历。
比如快排,两个指针分别 i=l-1 j=r+1, l r是自己定义的两个边界。
归并中也是这样,让两个指针分别指向开头和mid mid=l+r>>1;