CSES.1141 C++题解
题意
有一个长度为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; }