这道题是滑动窗口题,需要我们维护区间的元素不重复,然后右指针移动与否取决于滑窗内的元素是否重复
如果重复了,则查找第一个重复的元素,仅此而已
C++ 代码
#include <iostream>
#include <unordered_map>
using namespace std;
int main(){
int n;
cin >> n;
int f[n];
for(int i = 0; i < n; ++i)
cin >> f[i];
int i = 0, j = 0;
int ans = -1;
while(j < n){
unordered_map <int, int> m{{f[j], j++}};
//优化时间效率的地方:每次从第一个重复的元素的位置后开始再设置滑动窗口
while(j < n && m.find(f[j]) == m.end()) m.insert({f[j], j++});
ans = max(ans, (int)m.size());
if(j == n) break;
j = m[f[j]] + 1;
}
cout << ans << endl;
return 0;
}