具体的题解全部在注释中,仅代表我对一些细节的看法与认识.
include[HTML_REMOVED]
using namespace std;
const int N=1e5+10;
int a[N],s[N],n;
//a[N]是原始数据的数组,s[N]是用于记录原始数据中每个数字出现的个数,例如:对于s[1]的值就是a[N]中”1”出现的个数,以此类推.
int main()
{
scanf(“%d”,&n);
for (int i=0;i<n;++i) scanf(“%d”,&a[i]);
int len=0;//记录最长长度.
for (int i=0,j=0;i<n;++i)
{
//每次i++,代表i指针向右移动一位,即出现新的a[i],则s[a[i]]++,代表这个数已经出现一次.
s[a[i]]++;
//当 s[a[i]]++ 之后,如果s[a[i]]>1,说明加进来的a[i],之前已经出现过了,此时j应该向后移动,直至s[a[i]]==1,同时在j左移的同时,
//s[a[j]]--,j所指向的数字从[j,i]之间的区间中去除了.
while (s[a[i]]>1)
{
s[a[j]]--;//在这个过程中就可以把之前出现过的a[i]从[j,i]区间中去除.
j++;
//注意:s[a[j]--,和j++的先后顺序
/*
先:s[a[j]]--;
后: j++;
原因:如果先是j++,那么j++之前所指向的元素不能从[j,i]区间中去除,会使计数错误;
所以应该是先把j所指的元素去除,然后j向后移动一位,进行s[a[i]]是否>1的判断,
如果>1,则继续对j执行相同的操作.
*/
}
len=max(len,i-j+1);//i-j+1就是[j,i]之间的区间长度.
}
printf("%d\n",len);
return 0;
}