题意
传送门
有一个长度为\(n\)的歌单,问最长多少首歌互不相同?
每首歌用一个\(1-10^9\)的整数表示。
样例输入
8
1 2 1 3 2 7 4 2
样例输出
5
算法
双指针算法。桶思想。
对于歌单中重复出现的数,可以用桶来存储。
定义两个指针i,j
,i
指向大数,j
指向小数。当出现某个桶的数大于1时,则将j
增加,直到原桶内的数等于1.i
每次都增加,直到\(n\)为止。
代码实现
#include<bits/stdc++.h>
using namespace std;
int a[200005],b[200005]={};
int main(){
ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
int i=0,j=0,ans=-1;
while(i<n){
b[a[i]]++;
while(b[a[i]]!=1){
b[a[j]]--;
j++;
}
ans=max(ans,i-j+1);
i++;
}
cout<<ans<<endl;
return 0;
}
标签:int,题解,样例,C++,歌单,CSES.1141
From: https://www.cnblogs.com/j1hx-oi/p/17739877.html