题目描述
马克吐温有一本非常著名的小说《百万英镑》,这本小说中主角最后归还了百万英镑给两位富翁。但结果就是两位富翁依然有无穷的问题需要进行社会实验,于是,他们打算进行第二次社会实验。那就是不同财富值的人在一场舞会上会发生什么事情。为了满足自己的好奇,百万富翁们邀请了全伦敦所有人来自己的舞会。舞会开始后他们就后悔了,因为来的人太多了,而且很多人的财富都相同,统计起来太费事了。所以百万富翁们找到你,希望你根据来舞会的时间,找出在一段时间内,来舞会的所有人财富值都互不相同的人数。
输入格式
第一行输入一个n表示有n个人参与舞会。
按照时间顺序输入n个人的财富值。
输出格式
输出在一段时间内参加舞会的所有人财富值都互不相同的人数的最大值。
样例
Input 1
7
2 3 4 5 5 6 7
Output 1
4
数据范围
每个人的财富值不超过 10 ^{11}
0\le n \le 10^6
题面分析
捕捉题目关键词:
在一段时间内,来舞会的所有人财富值都互不相同的人数。
翻译:
最长连续不重复子序列
看到这个关键词,可能很多同学都认为这是一道DP(其实我也这么想过
但,其实这题是双指针(怎么好像感觉有点贪心但好像又没有)
设 l 为当前区间的左边界, r 为当前区间的右边界,用一个 map 来储存当前区间有那些值
r 增加
如果 a_r 没被 map 标记,标记 a_r 并继续
如果已经被标记, l 增加到和 a_r 相同的值的后一个下标,去除前面的 map 标记
记录最大的区间
参考核心代码:
int l=1,r=1;
int ans=1;
while(r<=n){//右边界不超限
mp[a[r]]++;
if(mp[a[r]]>1){
while(a[l]!=a[r]) mp[a[l]] - -,l++;//将l增加到和a[r]相同的下标
mp[a[l]] - -;
l++;//增加到下一个
}
ans=max(ans,r-l+1);
r++;
}
点个赞吧QWQ