CSES.1141 C++题解

题意

传送门
有一个长度为\(n\)的歌单,问最长多少首歌互不相同?

每首歌用一个\(1-10^9\)的整数表示。

样例输入

8
1 2 1 3 2 7 4 2

样例输出

5

算法

双指针算法。桶思想。

对于歌单中重复出现的数,可以用桶来存储。

定义两个指针i,ji指向大数,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;
}
posted @ 2023-10-02 13:19  j1hx  阅读(66)  评论(0)    收藏  举报