題目描述
把只包含因子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...