Leetcode 剑指 Offer 49. 丑数
题目
我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。
示例:
输入: n = 10
输出: 12
解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
思路
- 使用优先级队列, 由于这道题目要求的是只包含2,3,5的因子, 所以我们每次对top元素乘以2,3,5,这样就可以保证因子只是2,3,5
- 加上一个计数变量, 输出top元素即可
代码 —— c++
class Solution {
public:
int nthUglyNumber(int n) {
unordered_map<long long, bool> mp = {{1, true}};
priority_queue<long long, vector<long long>, greater<long long>> q;
q.push(1);
int cnt = 1;
while (cnt < n) {
auto data = q.top();
q.pop();
++cnt;
if (!mp[2 * data]) {
mp[2 * data] = true;
q.push(2 * data);
}
if (!mp[3 * data]) {
mp[3 * data] = true;
q.push(3 * data);
}
if (!mp[5 * data]) {
mp[5 * data] = true;
q.push(5 * data);
}
}
return q.top();
}
};