读书人

笔试遇到一个算法类题目求大神讲解

发布时间: 2013-03-29 14:24:52 作者: rapoo

笔试碰到一个算法类题目,求大神讲解
题目描述:
有一串玛瑙项链,项链是环形的,总共有N颗玛瑙,M(M<=9)种颜色。我们需要截取项链中的一整段(连续的子链)
要求:
截取的这一段子链玛瑙数最少,并且包含M种颜色。
时间复杂度O(n),空间复杂度O(1)

我有个思路是遍历这一项链,每次取长度为M的子链判断其中不同颜色的个数,得到冗余度最小的(不同颜色最多)的那个子链,然后延伸这个子链取得其他颜色,直至包含了M种颜色。
不过感觉这思路好像有些不对...

还有木有其他方法呢?
[解决办法]
应该是用双指针维护个区间吧,设两个指针left,right
初始left=0,right=0
设一个数组t[m]以及变量cnt=0(表示left->right区间内的颜色数),以及min=n。
如果cnt<m,根据right位置的颜色更新t[m]和cnt,m=(m+1)%n;
如果cnt==m,如果right-left小于min则更新min,根据left位置的颜色,更新cnt和t[m],同时left++;
一直到left==n为止
[解决办法]
找到一篇文章
求字符串指定最小全集子串
http://www.vanjor.org/blog/2011/05/find-dic-substring/
[解决办法]

引用:
引用:应该是用双指针维护个区间吧,设两个指针left,right
初始left=0,right=0
设一个数组t[m]以及变量cnt=0(表示left->right区间内的颜色数),以及min=n。
如果cnt<m,根据right位置的颜色更新t[m]和cnt,m=(m+1)%n;
如果cnt==m,如果right-left小于……

1.要是不喜欢用%,扩展长度为2*n right范围为[0,n-1]
2.虽是枚举,但为线性,每次不必重头枚举起。
和以前答的http://bbs.csdn.net/topics/390037654这个很类似

读书人网 >C++

热点推荐