题目链接
k彩色区间-美团2023笔试(codefun2000)
题目内容
塔子哥是一名设计师,最近接到了一项重要任务:设计一个新款的生日蜡烛,以庆祝公司成立20周年。为了使蜡烛看起来更加炫目,塔子哥计划在蜡烛上缠绕彩带。他买了一串长度为 N 的非常漂亮的彩带,每一厘米的彩带上都是一种色彩,但是当他拿到彩带后才发现,彩带上的颜色太多了,超出了他设计中所需要的颜色种类数量。
于是,塔子哥决定从彩带上截取一段,使得这段彩带上的颜色种类不超过K种。但是,他希望这段彩带尽量长,这样才能在蜡烛上缠绕出更加炫目的效果。为了尽快完成设计,他来找你求助,希望你能帮他设计出一种截取方法,使得截取出来的彩带尽可能长,并且颜色种类不超过K种。
输入描述
第一行两个整数N,K,以空格分开,分别表示彩带有N厘米长,你截取的一段连续的彩带不能超过K种颜色。接下来一行N个整数,每个整数表示一种色彩,相同的整数表示相同的色彩。 1≤N,K≤5000,彩带上的颜色数字介于[1,2000]之间
输出描述
一行,一个整数,表示选取的彩带的最大长度。
样例1
输入
8 3
1 2 3 2 1 4 5 1
输出
5
提示
最长的一段彩带是[1,2,3,2,1],共5厘米。
题解1
// 双指针
#include<bits/stdc++.h>
using namespace std;
const int N = 5005;
int n, k, a[N], cnt[N], colorKind;
int main(){
scanf("%d%d", &n, &k);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
int L = 1, R = 1, ans = 1;
while(R <= n){
if(cnt[a[R]]) cnt[a[R]]++;
else {
cnt[a[R]] = 1;
colorKind++; // 颜色种类数+1
}
if(colorKind <= k) {
ans = max(ans, R - L + 1);
}else {
cnt[a[L]]--;
if(cnt[a[L]] == 0) colorKind--;
L++;
}
R++;
}
printf("%d\n", ans);
return 0;
}