设计一个算法,找出只含素因子2,3,5 的第 n 小的数。
符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12…
我们可以认为1也是一个丑数
样例:如果n = 9, 返回 10
挑战:要求时间复杂度为O(nlogn)或者O(n)
方法一:如果采用遍历的方式,无法完全通过,会造成超时。
class Solution {
public:
    /**
     * @param n: An integer
     * @return: the nth prime number as description.
     */
    long long nthUglyNumber(int n) {
        // write your code here
        int count = 0;  
        int i = 0;    
        while(count < n)  
        {  
            m++;  
            int number = i;  
            while(number % 2 == 0)  
                number = number / 2;  
            while(number % 3 == 0)  
                number = number / 3;  
            while(number % 5 == 0)  
                number = number / 5;  
            if(number == 1)  
            {  
                count++;  
            }  
        }  
        return i;  
    }
};
方法二:是从1开始构造丑数,然后依次计数。
class Solution {
public:
    /*
     * @param n an integer
     * @return the nth prime number as description.
     */
    int nthUglyNumber(int n) {
        // write your code here
        int count = 1;//统计丑数
        vector<int> ugly(n,0);//保存丑数
        ugly[0] = 1;//第一个丑数
        vector<int> idx(3,0);
        while(count < n)
        {
            int a = 2 * ugly[idx[0]];
            int b = 3 * ugly[idx[1]];
            int c = 5 * ugly[idx[2]];
            int temp = min(min(a, b), c);
            if(temp == a)
              ++idx[0];
            if(temp == b)
              ++idx[1];
            if(temp == c)
              ++idx[2];
            ugly[count] = temp;
            ++count;
        }
        return ugly[n-1];
    }
};