剑指 Offer 49. 丑数

剑指 Offer 49. 丑数

我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。

 

示例:

输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。

说明:  

  1. 1 是丑数。
  2. n 不超过1690。

 

解析:

2的次方,3的次方,5的次方,组合即可

然后放到set里,再遍历

很少,不会超时,只需要注意越界即可

class Solution {
public:
    set<long long> ss;
    int nthUglyNumber(int n) {
        vector<long long> nums[3];
        const unsigned long long maxn = 2147483647;
        long long a = 1, b = 1, c = 1;
        nums[0].push_back(1);
        nums[1].push_back(1);
        nums[2].push_back(1);
        for(int i = 1; i < 31; i++)
        {
            if(a * 2 <= maxn)
            {
                a *= 2;
                nums[0].push_back(a);
            }
            if(b * 3 <= maxn)
            {
                b *= 3;
                nums[1].push_back(b);
            }
            if(c * 5 <= maxn)
            {
                c *= 5;
                nums[2].push_back(c);
            }
        }
        for(int i = 0; i < nums[0].size(); i++)
        {
            long long a = nums[0][i];
            for(int j = 0; j < nums[1].size(); j++)
            {
                long long b = nums[1][j];
                for(int k = 0; k < nums[2].size(); k++)
                {
                    long long c = nums[2][k];


                    if((unsigned long long)(a * b) <= maxn && (unsigned long long)(a * c) <= maxn && (unsigned long long)(b * c) <= maxn && (unsigned long long)(a * b * c) <= maxn)
                    {
                        ss.insert(a * b * c);
                    }

                }
            }
        }
        ss.insert(1);
        int m = 0;
        long long ret;
        for(set<long long>::iterator it = ss.begin(); it != ss.end(); it++)
        {
            m++;
            if(m == n)
            {
                ret = *it;
                break;
            }


        }
        return ret;





    }
};

 

posted @ 2022-07-22 18:51  WTSRUVF  阅读(20)  评论(0编辑  收藏  举报