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++;
}
}