醜數能夠分解成2^x 3^y 5^z,
所以只需要把得到的醜數不斷地乘以2、3、5之後並放入他們應該放置的位置即可,
而此題的難點就在於如何有序的放在合適的位置。
1乘以 (2、3、5)=2、3、5;2乘以(2、3、5)=4、6、10;3乘以(2、3、5)=6,9,15;5乘以(2、3、5)=10、15、25;
從這裡我們可以看到如果不加策略地新增醜數是會有重複並且無序,
而在2x,3y,5z中,如果x=y=z那麼最小丑數一定是乘以2的,但關鍵是有可能存在x》y》z的情況,所以我們要維持三個指標來記錄當前乘以2、乘以3、乘以5的最小值,然後當其被選為新的最小值後,要把相應的指標+1;因為這個指標會逐漸遍歷整個陣列,因此最終陣列中的每乙個值都會被乘以2、乘以3、乘以5,也就是實現了我們最開始的想法,只不過不是同時成乘以2、3、5,而是在需要的時候乘以2、3、5.
number2、number3、number5分別記錄乘2的獲得最大值,乘3獲得的最大值以及乘5獲得的最大值的位置。
public
class
solution
if(res == uglynumber[number3]*3
)if(res == uglynumber[number5]*5
)}return uglynumber[index-1]
;}}
劍指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中的最小的乙個是下乙個醜數。...