原題目:
題目分析:
一 、暴力搜尋
1、最簡單的方法---暴力搜尋,逐個掃瞄第i個位置開始包含n中顏色最短區間,時間複雜度為o(m^2) 。
2、從i開始掃瞄,每出現一種新的顏色,計數+1 ,當計數=n時候,結束,此時即為i開始的最短區間 。
二 、
1、掃瞄一遍陣列m,計算出每種顏色在陣列m中下一次出現的位置,存在資料nextcolor[m]中 (每種顏色的最後乙個元素的下乙個位置記為-1 ,在後面的程式中需要特殊處理)。
2、從0位置開始掃瞄陣列m,找出第乙個包含所有顏色的區間,此時的開始位置即為begintag (此時是0),結束位置記為endtag 。
3、對begintag進行操作:如果begintag位置的顏色的下乙個顏色nextcolor[begintag]<=endtag ,則將begintag++ ,重複此步驟,直到nextcolor[begintag]>endtag 或者 begintag==endtag ,此時begintag---->endtag即為以endtag結束但包含所有顏色的最小區間 。
4、endtag後移一步,然後重複步驟3 。
5、重複步驟4 ,直到endtag=m.length-1 。
6、此時可以得到所有元素結尾的最短區間的長度,選取乙個最小的 。
**如下:
packageddc.test.com;
public
class
mnselecttestmain ;
getsuball(data,6);
}public
static
int getsuball(int colorarray,int
colorlength)
int least=new
int[colorarray.length];
int nextcolor=new
int[colorarray.length];
for(int i=0;i)
nextcolor[i]= -1;
int colorcounter=new
int[colorlength];
int colortmp=new
int[colorlength];
for(int i=0;i)
colortmp[i]= -1;
for(int i=colorarray.length-1;i>=0;i--)
int hascolor=0 ; //
已經發現的顏色總數
int begintag=0 ,endtag =0;
//找到第乙個包含所有顏色的結束點
while(endtag if(hascolor==colorlength)
break
; endtag++;
}//結束點逐步後移,然後找到以endtag為結束點的最短區間
while(endtagleast[endtag]=endtag-begintag+1;
endtag++;
}//列印
for(int
tt:least)
system.out.print(tt+" ");
system.out.println();
for(int
tt:colorarray)
system.out.print(tt+" ");
return
colorarray;
}}
N個扇形M種顏色
題 將乙個圓形等分成n個小扇形,將這些扇形標記為1,2,3,n,現在使用m種顏色對其塗色,要求相鄰兩個扇形顏色不相同。求 有多少種塗色方法?備註 1.不考慮數值越界情況 2.n 1,m 3 3.乙個例子 如果n 3,m 3時,一共有6種塗法 兩種方法 數學公式法 我所搜到的基本都是這種方法 遞迴自己...
染色問題(n個格仔,3種顏色)
有排成一行的 個方格,用紅 red 粉 pink 綠 green 三色塗每個格仔,每格塗一色,要求任何相鄰的方格不能同色,且首尾兩格也不同色 求全部的滿足要求的塗法.遞推公式 a1 3 a2 6 a 3,2 6 a3 6 a 3,3 6 an 2 a n 2 a n 1 n 4 證明 考慮第n 1個...
染色問題 n個格仔,3種顏色
有排成一行的 個方格,用紅 red 粉 pink 綠 green 三色塗每個格仔,每格塗一色,要求任何相鄰的方格不能同色,且首尾兩格也不同色 求全部的滿足要求的塗法.遞推公式 a1 3 a2 6 a 3,2 6 a3 6 a 3,3 6 an 2 a n 2 a n 1 n 4 證明 考慮第n 1個...