264. Ugly Number II 類別:動態規劃 難度:medium
阿新 • • 發佈:2019-02-07
題目:
Write a program to find the n
-th ugly number.
Ugly numbers are positive numbers whose prime factors only include 2, 3, 5
. For example, 1,
2, 3, 4, 5, 6, 8, 9, 10, 12
is the sequence of the first 10
ugly numbers.
Note that 1
is typically treated as an ugly number.
思路:
我們知道醜數是由某個醜數乘上2或者3或者5得來。而且初始化時第一個醜數是1。
- 我們將已經按順序求得的醜數放在陣列中,該陣列初始化時就只有一個1。
- 接下來考慮將已經求得的陣列中的某個元素乘上2或者3或者5得到下一個應該存入陣列的醜數。
- 比如當前的醜數陣列中最大的值是M,那麼下一個醜數應該是比M大的醜數。挑一個醜數乘上2,挑一個醜數乘上3,挑一個醜數乘上5,這三個結果都需要大於M。所以乘上2的那個醜數需要大於M/2,而乘上3的那個醜數需要大於M/3,乘上5的那個醜數應該大於M/5。
- 我們使用一個數組儲存2,3,5接下來乘的那個醜數的下標,使得結果都大於M。
- 這個醜數的下標什麼時候用來更新呢?初始化時下標都為0,因為這個時候醜數陣列中只有一個元素1。當將M加入到陣列後,把2,3,5對應的下標各自往後移動,使得乘的結果大於M。
class Solution { public: int nthUglyNumber(int n) { vector<int> dp(n); int index_2 = 0, index_3 = 0, index_5 = 0; int val_2 = 2, val_3 = 3, val_5 = 5; int i = 1; dp[0] = 1; for(;i < n;i++){ int val = min(val_2, min(val_3, val_5) ); if(val == val_2) {dp[i] = val_2; index_2++; val_2 = dp[index_2] * 2;} if(val == val_3) {dp[i] = val_3; index_3++; val_3 = dp[index_3] * 3;} if(val == val_5) {dp[i] = val_5; index_5++; val_5 = dp[index_5] * 5;} } return dp[n - 1]; } };