劍指offer 醜數(好題,思路)

2021-08-02 22:46:43 字數 2395 閱讀 1651

題目描述

把只包含因子2、3和5的數稱作醜數(ugly number)。例如6、8都是醜數,但14不是,因為它包含因子7。 習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。

思路:

似乎只能乙個個判過去。

判斷是否為醜數的時候,求因子時迴圈停止的條件是到平方根為止。(這麼做會超時)

而且題目中應該指的是僅有質數因子2,3,5!所以8也是醜數

利用動態規劃求解。

如果用普通思路的判斷方法。

說下思路,如果p是醜數,那麼p=2^x * 3^y * 5^z

那麼只要賦予x,y,z不同的值就能得到不同的醜數。

如果要順序找出醜數,要知道下面幾個特(fei)點(hua)。

對於任何醜數p:

(一)那麼2

*p,3

*p,5

*p都是醜數,並且2

*p<3

*p<5

*p(二)如果p

*p<2

*q,3

*p<3

*q,5

*p<5

*q現在說說演算法思想:

由於1是最小的醜數,那麼從1開始,把2

*1,3

*1,5

*1,進行比較,得出最小的就是1

的下乙個醜數,也就是2

*1, 這個時候,多了乙個醜數『2』,也就又多了3個可以比較的醜數,2

*2,3

*2,5

*2,這個時候就把之前『1』生成的醜數和『2』生成的醜數加進來也就是

(3*1,5

*1,2

*2,3

*2,5

*2)進行比較,找出最小的。。。。如此迴圈下去就會發現,

每次選進來乙個醜數,該醜數又會生成3個新的醜數進行比較。

上面的暴力方法也應該能解決,但是如果在面試官用這種方法,估計面試官只會搖頭吧

。下面說乙個o(n)的演算法。

在上面的特(fei)點(hua)中,既然有p

*p<2

*q,那麼

「我」在前面比你小的數都沒被選上,你後面生成新的醜數一定比「我」大吧,那麼你乘2生成的醜數一定比我乘2的大吧,那麼在我選上之後你才有機會選上。

其實每次我們只用比較3個數:用於乘2的最小的數、用於乘3的最小的數,用於乘5的最小的數。也就是比較(2

*x , 3

*y, 5

*z) ,x>=y>=z的,

重點說說下面**中p的作用:int p = new int ; p[0]表示最小用於乘2比較數在陣列a中的【位置】。 p[1]表示3,p[2]表示5

*/public class solution ;

public int getuglynumber_solution(int

index) ;

// num陣列下標為0,1,2的三個數分別為*2,*3,*5得到的數

int num = new int ;

int cur = 1;

while (cur < index)

return a[index - 1];

}private int finmin(int num1, int num2, int num3)

}下面的方法,並沒有維護之前那個方法所需要的num陣列,而是每次都生成三個數,用於比較(生成三個數的規則仍然相同)

public int getuglynumber_solution2(int n) //用list可能更好理解

return

list

.get(list

.size()-

1); }

再來分步理解下這個問題,首先由三個基數,分別是2,3,5。然後第乙個醜數定為1。我們要得到順序的第n個醜數,所以要把這之間的都求出來。

對於任何醜數p:

(一)那麼2

*p,3

*p,5

*p都是醜數,並且2

*p<3

*p<5

*p(二)如果p

*p<2

*q,3

*p<3

*q,5

*p<5

*q

從1開始,得到3個比較數,2,3,5;取最小的2放入list

此時list的數是1,2;

然後要得到下乙個數字,此時,在進行迭代運算時,應該計算1*3,1*5,和2*2。 因為之前是用1*2得到的最小值,所以這個式子不應該再算一次。然後得到3,入list。

此時list的數是1,2,3

再進行迭代運算時,應計算1*5,2*2,2*3。

刷題劍指offer 醜數

題目 我們把只包含因子2 3 5的數稱為醜數。求按從小到大的順序的第1500個醜數。例如6 8都是醜數,但14不是,因為它包含因子7.習慣上我們把1當做成第乙個醜數。思路 1 逐個判斷每個整數是不是醜數,直觀但不夠高效,這樣對於每乙個數不管是不是醜數我們都要進行計算。2 根據醜數的定義,醜數應該是另...

劍指offer 醜數

把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。分析 參考程式設計師面試金典 偽 如下 1 初始化array和佇列 q2 q3 q5 2 將1插入array 3 分別將1 2...

劍指Offer 醜數

我們把只包含因子 2 3 和 5 的數稱作醜數 ugly number 求按從小 到大的順序的第 1500 個醜數。例如 6 8都是醜數,但 14 不是,它包含因子 7。習慣上我們把 1當做第乙個醜數。解法一 逐一判斷是否是醜數,簡單但是不夠高效 數字n是數字m的因子說明m n 0。醜數的因子只有2...