264. 丑数 II
难度:中等
题意
给你一个整数 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
题意思路
1. 用优先队列
在此题汇总也就是最小堆来做,所以也就是头部取出的数为整个队列的最小值,那么用这个最小值来*2,*3,*5,得到的值可能有重复,那么再用一个unordered_set来存储这些值来判断这些值有没有在队列中出现过。
class Solution {
public:
int nthUglyNumber(int n) {
unordered_set<long> st;
vector<long> factor{2,3,5};
st.insert(1ll);
priority_queue<long, vector<long>, greater<long> > qt;
qt.push(1ll);
int sum = 0;
long yy;
while(!qt.empty()) {
long qq = qt.top();
qt.pop();
sum++;
if(sum == n) {
yy = qq;
break;
}
for(auto ss : factor) {
long tt = ss * qq;
if(st.count(tt)) continue;
qt.push(tt);
st.insert(tt);
}
}
return yy;
}
};
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];
}
};