k彩色区间-美团2023笔试(codefun2000)

题目链接
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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值