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

劍指offer:醜數

問題描述:

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

解題思路:

        這其實是個數學問題,要用數學的角度去看,設醜數為X,則有公式:X = X1 \ast 2 + X2 \ast 3 + X3 \ast 5     ,然後把X從小到大排個序,對X1,X2和 X3 從1到n開始取值,看X1*2,X2*3,X3*5哪個最小,把最小的存入陣列,然後對那個最小的數的係數Xi加1.

正確答案:

class Solution {
public://別人的程式碼就是精簡,慚愧啊,繼續學習。
    int GetUglyNumber_Solution(int index) {
        if (index < 7)return index;
        vector<int> res(index);
        res[0] = 1;
        int t2 = 0, t3 = 0, t5 = 0, i;
        for (i = 1; i < index; ++i)
        {
            res[i] = min(res[t2] * 2, min(res[t3] * 3, res[t5] * 5));
            if (res[i] == res[t2] * 2)t2++;
            if (res[i] == res[t3] * 3)t3++;
            if (res[i] == res[t5] * 5)t5++;
        }
        return res[index - 1];
    }
};

 剛開始我是這樣做的,然而發現超時:

public class Solution {
    public int GetUglyNumber_Solution(int index) {
        int num = 0;
        int key = 0;
        for(int k = 2;; k++){
            int i = k;
            while(i % 2 == 0 ){
                i = i / 2;
            }
            while(i % 3 == 0){
                i = i / 3;
            }
            while(i % 5 == 0){
                i = i / 5;
            }
            if(i == 1) num++;
            if(num == index) {
                key = k;
                break;
            }
        }
        return key;
    }
}