给出一个整数 n ,请找出并返回第 n 个丑数 。
丑数 就是质因子只包含 2、3 和 5 的正整数。
示例 1:
输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。
示例 2:
输入:n = 1 输出:1 解释:1 通常被视为丑数。
提示:
1 <= n <= 1690
思路:
这次最暴力的做法当然是直接循环去乘 2、3 和 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)