题目:
本题有T组测试样例,对于每组样例:
给定一个长度为n的数组,求其中最长的连续且无重复数字的子序列的长度。输入格式:
第一行一个整数T,表示样例数。(1≤T≤10)
第一行一个整数n。(1≤n≤10^5)
第二行n个整数ai(1≤ai≤10^5)
数据保证∑n≤10^5。输出格式:
一个整数表示答案。
总体使用了“桶”的思想
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 9;
//a数组为样例数组,c数组为频率数组(也可以理解为桶数组) -> 计算样例数组中的每个元素在滑动窗口中出现的次数。
int a[N], c[N];
int main(){
int t; cin >> t;
while(t --){
int n; cin >> n;
//从i = 1开始输入是因为使用了双指针(滑动数组),初始化j = 0
for(int i = 1; i <= n; ++ i) cin >> a[i]; //输入样例
//初始化答案计数器
long long ans = 0;
//因为题目有多组样例,所以每次最外层的while循环要将频率数组重新初始化
memset(c, 0, sizeof(int) * (n + 1));
//i初始化为1,为左窗口;j初始化为0,为右窗口
for(int i = 1, j = 0; i <= n; ++ i){
//当j + 1没有超出样例数组,并且a[j + 1]对应的频率数组中的位置为0时执行循环
while(j < n && !c[a[j + 1]]) c[a[++ j]] ++; //将a[j + 1]对应的频率数组中的位置 + 1
//比较出最长不重复子序列
ans = max(ans, (long long)j - i + 1);
//在移动左窗口的同时,将左窗口的所在的元素对应的频率数组清零
c[a[i]] --;
}
cout << ans << endl;
}
return 0;
}