劍指Offer 醜數(動態規劃求解) (三十三)

2021-10-02 21:17:29 字數 1079 閱讀 1540

題目描述

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

實現思路

常規窮舉:乙個數如果分別整除2,3,5後,得到1,那麼這個數是醜數,時間複雜度為o(n),另外還要套乙個外迴圈,統計當前醜數個數,所以總時間複雜度o(n^2)。

動態規劃:遞迴思路一般為,求第n-1個醜數,依次遞迴下去,直到第1個醜數,這就要找出第1個醜數和第2個醜數的關係了。遞推思路,則是先求第1個醜數,依次類推,直到求到第n個醜數。1是第乙個醜數,2,3,5分別乘以1以後,可得2,3,5也是醜數,醜數之間相乘可得醜數,也就是說除1以外的醜數都可以由與2,3,5分別相乘得來。令第乙個醜數dp[0]=0,那麼有:

dp[1] = min(2 * dp[0], 3 * dp[0], 5 * dp[0])=2,因為要按順序儲存醜數在dp中,所以取相乘後得到的醜數的最小值。

dp[2] = min(2 * dp[1], , 3 * dp[0], 5 * dp[0])=3.

dp[3] = min(2 * dp[1], , 3 * dp[1], 5 * dp[0])=4.

dp[4] = min(2 * dp[2], , 3 * dp[1], 5 * dp[0])=5.

dp[5] = min(2 * dp[2], , 3 * dp[1], 5 * dp[1])=6. //注意這裡是min(6, 6, 10),所以醜數2和3的索引都要自增1,否則會導致dp[5]和dp[6]都儲存了6,那就重複了.

dp[6] = min(2 * dp[3], , 3 * dp[2], 5 * dp[1])=8.

**實現

動態規劃的遞推實現:

//方法二:動態規劃

public

static

intgetuglynumber_solution1

(int index)

return dp[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中的最小的乙個是下乙個醜數。...