1. 程式人生 > >劍指offer------醜數

劍指offer------醜數

題目

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

思路

所謂的一個數m是另一個數n的因子,是指n能被m整除,也就是n%m==0。根據醜數的定義,醜數只能被2、3和5整除。根據醜數的定義,醜數應該是另一個醜數乘以2、3或者5的結果(1除外)。因此我們可以建立一個數組,裡面的數字是排好序的醜數,每一個醜數都是前面的醜數乘以2、3或者5得到的。

這個思路的關鍵問題在於怎樣保證數組裡面的醜數是排好序的。對乘以2而言,肯定存在某一個醜數T2,排在它之前的每一個醜數乘以2得到的結果都會小於已有最大的醜數,在它之後的每一個醜數乘以乘以2得到的結果都會太大。我們只需要記下這個醜數的位置,同時每次生成新的醜數的時候,去更新這個T2。對乘以3和5而言,也存在著同樣的T3和T5。

程式碼:

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        if(index < 7){
            return index;
        }
        vector<int> res(index);
        for(int i = 0; i < 6; i++){
            res[i] = i + 1;
        }
        int t2 = 3, t3 = 2, t5 = 1;
        for(int i = 6; i < index; i++){
            res[i] = min(res[t2] * 2, min(res[t3] * 3, res[t5] * 5));
            while(res[i] >= res[t2] * 2){
                t2++;
            }
            while(res[i] >= res[t3] * 3){
                t3++;
            }
            while(res[i] >= res[t5] * 5){
                t5++;
            }
        }
        return res[index - 1];
    }
};