有一串首尾相连的珠子,共有m个,每一个珠子有一种颜色,并且颜色的总数不超过n(n<=10),求连续的珠子的颜色总数为n时,长度最小的区间。 - I smell magic in the air - C++博客
有一串首尾相连的珠子,共有m个,每一个珠子有一种颜色,并且颜色的总数不超过n(n<=10),求连续的珠子的颜色总数为n时,长度最小的区间。
http://www.cnblogs.com/dplearning/p/3998856.html
http://mmdev.iteye.com/blog/1760457
Read full article from 有一串首尾相连的珠子,共有m个,每一个珠子有一种颜色,并且颜色的总数不超过n(n<=10),求连续的珠子的颜色总数为n时,长度最小的区间。 - I smell magic in the air - C++博客
有一串首尾相连的珠子,共有m个,每一个珠子有一种颜色,并且颜色的总数不超过n(n<=10),求连续的珠子的颜色总数为n时,长度最小的区间。
先从index=0处搜索,每检查一颗珠子,响应的颜色数量+1,如果是新的颜色则总颜色数+1.
当颜色总数为n时,找到第一个满足条件的连续序列。
1.从该序列起始处搜索,若搜索处的颜色数量不为1,则表明该串还有别的珠子有该颜色,继续往前搜索并更新该序列,起始索引位置+1.
若搜索处颜色数量为1,停止搜索。
2。比较最佳序列长与当前序列长,更新最佳序列。记录当前序列起始位置。
从第一个满足条件的序列继续index++,并检查1,2条件。
#define MAXN 10 int colors[MAXN];//record the counter of one color int colorsCounter; void find(int arr[],int len, int colorsNeed) { int bestStartIndex = 0; int bestLen = len; int lastStartIndex = 0; for ( int i=0; i<len; ++i) { if (!colors[arr[i]]) colorsCounter++; colors[arr[i]]++; if (colorsCounter==colorsNeed) { int j = lastStartIndex; while (colors[arr[j]]>1) { colors[arr[j]]--; ++j; } if (i-j+1<bestLen) { bestStartIndex = j; bestLen = i-j+1; if (bestLen==colorsNeed) break; } lastStartIndex = j; } } cout << bestStartIndex << endl; cout << bestLen << endl; for (int i=bestStartIndex; i<bestLen+bestStartIndex; ++i) cout << arr[i] << " "; cout << endl; }
如果是环的话多了一遍循环:
第二次for循环的作用是建立再第一次for循环的基础上的。假设第一次for循环已经确定了最佳的起点和终点。那么第二次for循环就从下标为0的元素开始寻找,相当于循环到第一个元素重新开始。这里注意第二次for循环的结束条件。
http://www.cnblogs.com/dplearning/p/3998856.html
http://mmdev.iteye.com/blog/1760457
Read full article from 有一串首尾相连的珠子,共有m个,每一个珠子有一种颜色,并且颜色的总数不超过n(n<=10),求连续的珠子的颜色总数为n时,长度最小的区间。 - I smell magic in the air - C++博客