m個珠子共n種顏色,找出包含n種顏色的最短連續片段

2022-05-25 23:18:22 字數 1740 閱讀 3965

原題目:

題目分析:

一 、暴力搜尋

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、此時可以得到所有元素結尾的最短區間的長度,選取乙個最小的 。

**如下:

package

ddc.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個...