1. 程式人生 > >lintcode 醜數II

lintcode 醜數II

描述

設計一個演算法,找出只含素因子235 的第 n 小的數。

符合條件的數如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12...

我們可以認為1也是一個醜數

解法:只含素因子2或3或5的數可以表示成x=2^{m}*3^{n}*5^{p}

假設我們得到了上一個醜數,通過*2,*3或者*5可以得到新的醜數。

問題是:去重  剔除像2*2*3=2*3*2這種情況;

演算法:

1.最初的醜數為1。

2.我們使用3個遊標p1=p2=p3=1,他們所指向的位置,分別*2,*3,*5得到下一個醜數。

3.我們要從小到大生成醜數,因此我們當前生成的醜數為Arr[p1]*2,Arr[p2]*3,Arr[p3]*5中的最小值。

4.當我們得到最小值之後,我們需要判斷這個醜數是哪個遊標導致的,將這個遊標的索引++。

5.生成的第n個醜數即為所要求的值。

AC程式碼:

class Solution {
public:
    /**
     * @param n: An integer
     * @return: the nth prime number as description.
     */
    int nthUglyNumber(int n) {
        // write your code here
        int Arr[n+1],p2,p3,p5;
        p2=p3=p5=1;
        Arr[1]=1;
        for(int i=2;i<=n;i++){
            Arr[i]=min(min(Arr[p2]*2,Arr[p3]*3),Arr[p5]*5);
            if(Arr[i]==Arr[p2]*2){
                p2++;
            }
            if(Arr[i]==Arr[p3]*3){
                p3++;
            }
            if(Arr[i]==Arr[p5]*5){
                p5++;
            }
        }
        return Arr[n];
    }    
};