劍指offer-醜數(Java)
阿新 • • 發佈:2019-02-11
題目描述
把只包含因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因為它包含因子7。 習慣上我們把1當做是第一個醜數。求按從小到大的順序的第N個醜數。
思路:
使用一個數組將之前已經求出來的醜數儲存起來,然後依次用2,3,5乘上陣列中已經求出來的醜數,選出其中最小的一個儲存到陣列中。假設陣列中存的最大丑數是Max,那麼只要求出2,3,5乘以陣列中的某一個數剛好比Max大,然後選出三者間最小的就可以。例如:當前陣列中的醜數是:1,此時2*1,3*1,5*1,中最小的是2,將2存到陣列中,此時陣列中的數為1,2。Max=2,又因為2*1==Max,因此2乘的醜數應該為2*2,3*1>2,5*1>2,在新的4,3,5中最小的為3將3存到陣列中,依次迴圈。
public class GetUglyNumber_Solution {
public static void main(String[] args) {
// TODO Auto-generated method stub
int index=11;
System.out.println(GetUglyNumber(index));
}
public static int GetUglyNumber(int index)
{
if(index==0)
return 0;
//如果index==0,返回0
int urgly[]=new int[index];
urgly[0]=1;
//當index!=0時將第一個醜數1放到陣列中。
int urglyindex=1,min;
int nextindex2=0,nextindex3=0,nextindex5=0;
while(urglyindex<index)
{
min=urgly[nextindex2]*2<urgly[nextindex3]*3?urgly[nextindex2]*2:urgly[nextindex3]*3 ;
//min用於儲存新產生的大於當前陣列最大值的最小丑數
min=min<urgly[nextindex5]*5?min:urgly[nextindex5]*5;
urgly[urglyindex]=min;
while(urgly[nextindex2]*2<=min)
nextindex2++;
//如果urgly[nextindex2]小於當前陣列的最大值,nextindex2++;
while(urgly[nextindex3]*3<=min)
nextindex3++;
//如果urgly[nextindex3]小於當前陣列的最大值,nextindex3++;
while(urgly[nextindex5]*5<=min)
nextindex5++;
//如果urgly[nextindex5]小於當前陣列的最大值,nextindex5++;
urglyindex++;
//urglyindex++;尋找下一個醜數
}
return urgly[index-1];
}
}