C - Colorful Candies
题意理解:有一个不同种类糖果的队列,按顺序选取k个糖果,问取到不同种类的最大值!
思路:暴力N*N会TLE,此时还有个方法就是双指针,通过map存k范围内的数字,改变指针减去最开头的数并加入新的数进行比较!
代码如下:有注释!
#include<bits/stdc++.h>
using namespace std;//思路,首先暴力N*N肯定超时,我们采取双指针方式
const int N=3*1e5+5;
typedef long long ll;
ll cnt[N];
map<ll,int> m; //因为cnt内数字范围在1-1e9,因此采用 map 来统计一段区间内已有的值
map<ll,int> ::iterator it;//这里不能用map.szie(),m[0]也会被记录
int main(){
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++) scanf("%lld",&cnt[i]);//输入
for(int i=1;i<=k;i++) m[cnt[i]]++;//统计第一次输入的值并加入map
int res=m.size();//计算此时不同的值
int count=res;//计算每次变化后不同的值,此方法是重点
for(int i=1;i<=n-k;i++){//进行的比较次数
m[cnt[i]]--;//减去第一个值
if(m[cnt[i]]==0) count--;//如果为0说明种类减少了
if(m[cnt[i+k]]==0) count++;//类似
m[cnt[i+k]]++;//加上下一个值
res=max(res,count);//每次进行比较
}
printf("%d\n",res);
return 0;
}