題目:我們把只包含因子2、3和5的數稱作醜數(ugly number)。求按從小到大的順序的第1500個醜數。例如6、8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做第乙個醜數。
思路:
直觀思路:從1開始逐一判斷每個整數是否為醜數,直到找到第n個醜數,時間效率太低。因為對於每乙個整數都要計算,即使乙個整數不是醜數,也要進行除法和取餘操作。
空間換時間的解法:
建立陣列存放已經排序好的醜數,這將消耗一定的記憶體開銷。關鍵是怎樣確保陣列裡的醜數是有序的。根據醜數的定義,醜數應該是另乙個醜數的2、3或者5倍的結果,因此,我們從陣列中已有的醜數里找到三個醜數t2、t3、t5,它們分別和2、3、5相乘得到的值恰好比已有的最大醜數大,三個乘積中最小的乙個就是下乙個醜數,存放入陣列中,同時更新t2、t3、t5,使它們仍然保持與2、3、5的乘積恰好比已有的最大醜數大。這種思路不需要在非醜數上進行計算,時間複雜度較低。
考點:以空間換時間
實現:
public int getuglynumber_solution(int index)
/*逐一判斷每個數是否為醜數,效率太低
public int getuglynumber_solution1(int index)
while(data%3==0)
while(data%5==0)
if(data == 1)else
}
2.醜數是另乙個醜數的2、3或者5倍,要記住這類特性和規律。特別是在遇到類似的新概念時。 劍指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...
劍指offer 醜數
把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。分析 為了保證時間達到要求,可以將所求得的醜數都儲存在陣列中,然後再取出。前面的醜數乘以2 3或5中的最小的乙個是下乙個醜數。...