LintCode刷题之路(四):丑数

设计一个算法,找出只含素因子2,3,5 的第 n 小的数。
符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12…
样例
如果n = 9, 返回 10
挑战
要求时间复杂度为O(nlogn)或者O(n)

思路:
根据丑数的定义可知,每一个丑数都是由前面的丑数生成。例如:2是由1*2得来,3是由1 *3得来。

C++:

class Solution {
public:
    /**
     * @param n: An integer
     * @return: the nth prime number as description.
     */

    int min(int a,int b)
    {
        if(a<b)
        {
            return a;
        }
        else
        {
            return b;
        }
    }
    int nthUglyNumber(int n) {
        // write your code here
        int *ugly = new int[n];
        ugly[0] = 1;
        int num_2 = 0;
        int num_3 = 0;
        int num_5 = 0;

        for(int i=1;i<n;i++)
        {
            ugly[i] = min(min(ugly[num_2]*2,ugly[num_3]*3),ugly[num_5]*5);
            //下一个生成的丑数,是由已生成的最大的2丑数、3丑数、5丑数当中最小的来生成的。
            if(ugly[i]/ugly[num_2]==2)
            {
                num_2++;
            }
            if(ugly[i]/ugly[num_3]==3)
            {
                num_3++;
            }
            if(ugly[i]/ugly[num_5]==5)
            {
                num_5++;
            }

        }
        return ugly[n-1];

    }
};

Py3:

class Solution:
    """
    @param n: An integer
    @return: the nth prime number as description.
    """
    def nthUglyNumber(self, n):
        # write your code here
        ugly = [1]
        num_2,num_3,num_5 = 0,0,0
        for i in range(1,n):
            Min = min(min(ugly[num_2]*2,ugly[num_3]*3),ugly[num_5]*5)
            ugly.append(Min)
            if ugly[i]/ugly[num_2]==2:
                num_2 += 1
            if ugly[i]/ugly[num_3]==3:
                num_3 +=1
            if ugly[i]/ugly[num_5]==5:
                num_5 += 1

        return ugly[n-1]

猜你喜欢

转载自blog.csdn.net/qq_38213612/article/details/80252074