丑数②
链接
https://leetcode-cn.com/problems/ugly-number-ii/
代码
最小堆加set去重
class Solution {
public:
int nthUglyNumber(int n) {
vector<int> factors = {2, 3, 5};
unordered_set<long> seen;
priority_queue<long, vector<long>, greater<long>> heap;
seen.insert(1L);
heap.push(1L);
long ugly = 0;
for(int i=0; i<n; i++){
long curr = heap.top();
ugly = curr;
heap.pop();
for(int factor : factors){
long curr_ = factor * curr;
if(!seen.count(curr_)){
seen.insert(curr_);
heap.push(curr_);
}
}
}
return ugly;
}
};
动态规划
class Solution {
public:
int nthUglyNumber(int n) {
vector<int> factors = {2, 3, 5};
long dp[n+1];
dp[1] = 1;
int p2 = 1;
int p3 = 1;
int p5 = 1;
for(int i=2; i<=n; i++){
long num2 = dp[p2] * 2;
long num3 = dp[p3] * 3;
long num5 = dp[p5] * 5;
dp[i] = min(num2, min(num3, num5));
if(dp[i] == num2){
p2++;
}
if(dp[i] == num3){
p3++;
}
if(dp[i] == num5){
p5++;
}
}
return dp[n];
}
};