思路1
- 只包含2 3 5 的因数,也就是丑数由只能由基础丑数* 2 *3 *5得到
- 注意基础丑数 *2 *3 *5会存在重复,需要使用hashset进行去重
代码1
class Solution {
public:
int nthUglyNumber(int n) {
vector<int> factors = {2, 3, 5};
unordered_set<long> hashset;
priority_queue<long, vector<long>, greater<long>> pri_queue;
hashset.insert(1L);
pri_queue.push(1L);
int ugly = 0;
for (int i = 0; i < n; i++) {
long curr = pri_queue.top();
pri_queue.pop();
ugly = (int)curr;
for (int factor : factors) {
long next = curr * factor;
if (!hashset.count(next)) {
hashset.insert(next);
pri_queue.push(next);
}
}
}
return ugly;
}
};
思路2
- 方法1有太多的重复丑数组合,导致时间效率低下
- 如何避免丑数的重复计算?当得到的num1 num2 num3与当前dp[i] 相等则跳过
代码2
class Solution {
public:
int nthUglyNumber(int n) {
vector<int> dp(n + 1);
dp[1] = 1;
int p2 = 1, p3 = 1, p5 = 1;
for (int i = 2; i <= n; i++) {
int num2 = dp[p2] * 2, num3 = dp[p3] * 3, num5 = dp[p5] * 5;
dp[i] = min(min(num2, num3), num5);
if (dp[i] == num2)
p2++;
if (dp[i] == num3)
p3++;
if (dp[i] == num5)
p5++;
}
return dp[n];
}
};