百度研发鄙视题

2》一串首尾相连的珠子m个,有N中颜色,取其中一段包含N种颜色并且长度最短。

代码使用July的100题的代码,但是源代码没有考虑循环的情况,我将珠子串复制了一份,与原来的串首尾相连来解决循环。

看代码:

/*
 * 百度研发 一串首位相连的珠子(m个),有N种颜色
 * @ a, 相连的珠子,有n个
 * @ n,个数
 * @ m, 颜色种数
 */
int shortestFullColor(int a[], int n, int m)
{
	//为了使用循环,我们将a转化成2份aa,
	int *aa = new int[2*n];
	int *c = new int[m];
	int ctr = m;
	int h = 0, t = 0;
	int min = n;

	for(int i = 0; i< n; ++i)
	{
		aa[i] = a[i];
		aa[i + n] = a[i];
	}

	for(int i = 0; i < m; ++i)
	{
		c[i] = 0;
	}
	while(1){
		//获取能够容纳ctr种颜色的h
		while(ctr > 0 && h < 2*n){
			if(c[aa[h]] == 0)
				ctr--;
			c[aa[h]]++;
			h++;
		}
		if(h >= 2*n)
			return min;
		//对t进行紧缩,使h-t构成的段最短
		while(1){
			c[aa[t]]--;
			if(c[aa[t]] == 0)
				break;
			t++;
		}
		if(min > h-t)
			min = h - t;
		//尾前移,颜色种数加1
		t++;
		ctr++;
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值