一串首尾相连的珠子(m 个),有N种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短并分析时间复杂度与空间复杂度。
#include <stdio.h> #include <string.h> #define MAXN 10 int findMinBeadSeq(int arr[],int len,int colorsNeed) { //count表示当前颜色个数,c[arr[i]]表示,arr[i]这种颜色有几个 int c[MAXN],count=0; int i,k,bestStart=0,bestLen=len,lastStart=0; memset(c,0,MAXN*sizeof(int)); for(i=0;i<len;++i) { if(c[arr[i]]==0) ++count; ++c[arr[i]]; if(count==colorsNeed) { k = lastStart; while (c[arr[k]] > 1) { --c[arr[k]]; ++k; } if (i - k + 1 < bestLen) { bestLen = i - k + 1; bestStart = k; if (bestLen == colorsNeed) break; } lastStart = k; } } printf("bestStartIndex:%d \nbestLen:%d\n", bestStart, bestLen); for (i = bestStart; i < bestLen + bestStart; ++i) printf("%d ", arr[i]); printf("\n"); return bestLen; } int main() { int i=0; int arr[] = {1,2,2,3,5,4,1,3,4,5,2,2,2,3,5,4,2,3,2,4,3,2,1,2,1,4,5,2,2,2,2,3}; int m = sizeof(arr)/sizeof(arr[0]); for ( i=0; i<m; ++i) printf("%d ",arr[i]); printf("\n"); int n = 5; findMinBeadSeq(arr,m,n); return 0; }