1. 程式人生 > >264. Ugly Number II 類別:動態規劃 難度:medium

264. Ugly Number II 類別:動態規劃 難度:medium

題目:

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. 我們將已經按順序求得的醜數放在陣列中,該陣列初始化時就只有一個1。
  2. 接下來考慮將已經求得的陣列中的某個元素乘上2或者3或者5得到下一個應該存入陣列的醜數。
  3. 比如當前的醜數陣列中最大的值是M,那麼下一個醜數應該是比M大的醜數。挑一個醜數乘上2,挑一個醜數乘上3,挑一個醜數乘上5,這三個結果都需要大於M。所以乘上2的那個醜數需要大於M/2,而乘上3的那個醜數需要大於M/3,乘上5的那個醜數應該大於M/5。
  4. 我們使用一個數組儲存2,3,5接下來乘的那個醜數的下標,使得結果都大於M。
  5. 這個醜數的下標什麼時候用來更新呢?初始化時下標都為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];
    }
};