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];
    }    
};

猜你喜欢

转载自blog.csdn.net/qq_39304630/article/details/85616758