一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度

#include <iostream>
#define COLOR 3
#define LENGTH 10
using namespace std;
//假定m=10,n=3
int GetLength(int* zhuzi);//返回一段包含所有颜色的长度
bool IsAllColor(int* color);//判断是否含有所有颜色
int main()
{
	int zhuzi[LENGTH+1] = {1,2,1,2,3,1,1,2,2,3,0};//存放相应的颜色1~n,最后一位存放0,标记结束
	cout<<GetLength(zhuzi)<<endl;
	return 0;
}
int GetLength(int* zhuzi)
{
	int result = 0;
	int *p = zhuzi;
	int color[COLOR] = {0};//表示1~n每一种颜色的数目


	while(*p!=0&&!IsAllColor(color))
	{
		color[(*p++)-1]++;
		result++;
	}
	p = zhuzi + 1;
	if(IsAllColor(color))
		return result<GetLength(p)?result:GetLength(p);
	else
		return LENGTH;//表示没有找到一个包含所有颜色的段,就返回全长

}
bool IsAllColor(int* color)
{
	for(int i=0;i<COLOR;i++)
	{
		if(color[i]==0)
			return false;
	}
	return true;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值