[LeetCode] 264. 丑数 II

给出一个整数 n ,请找出并返回第 n 个丑数 。

丑数 就是质因子只包含 23 和 5 的正整数。

示例 1:

输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。

示例 2:

输入:n = 1 输出:1 解释:1 通常被视为丑数。

提示:

1 <= n <= 1690

思路:

这次最暴力的做法当然是直接循环去乘 23 和 5并各自维护计数器,最终计数器序号等于给定值的数那就是第 n 个 丑数了。诚然, 更暴力的还是建表查表……

AC代码:

class Solution {
public:
    int nthUglyNumber(int n) {
        vector<long long> dp(n);
        dp[0] = 1;
        
        int p2 = 0, p3 = 0, p5 = 0;
        
        for (int i = 1; i < n; i++) {
            long long next2 = dp[p2] * 2;
            long long next3 = dp[p3] * 3;
            long long next5 = dp[p5] * 5;
            
            dp[i] = min({next2, next3, next5});
            
            if (dp[i] == next2) p2++;
            if (dp[i] == next3) p3++;
            if (dp[i] == next5) p5++;
        }
        
        return (int)dp[n-1];
    }
};Code language: C++ (cpp)

天下无敌的查表法:

class Solution {
    struct UglyData {
        vector<int> list;           
        unordered_map<int, int> idx;
        
        UglyData() {
            for (long a = 1; a <= INT_MAX; a *= 2)
                for (long b = a; b <= INT_MAX; b *= 3)
                    for (long c = b; c <= INT_MAX; c *= 5)
                        list.push_back((int)c);
            
            sort(list.begin(), list.end());
        }
    };
    
    inline static const UglyData data;
    
public:
    int nthUglyNumber(int n) {
        return data.list[n - 1];
    }
};Code language: C++ (cpp)