CSES.1141 C++题解

本文介绍了如何使用双指针和桶思想解决CSES中的一个问题,计算在一个长度为n的歌单中,最多有多少首歌互不相同。通过遍历和调整指针,找出不重复歌曲的最大数目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;
 }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值