丑数
Solution
核心思路:
注意的几个点:
1.优先队列改变排序:
priority_queue<int,vector<int>,greater<int>> q;
2.用来判断是否访问过,可以用unordered_set
注意set的插入用的是insert而不是push
unordered_set<long long> vis;
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>//使用优先队列priority_queue导入queue就行了
#include<unordered_map>
#include<unordered_set>
using namespace std;//优先队列写法
int nthUglyNumber1(int n) {priority_queue<long long,vector<long long>,greater<long long>> q;//unordered_map<long long, long long> vis;unordered_set<long long> vis;q.push(1);long long x;for (int i = 1; i <= n; ++i) {x = q.top();q.pop();long long x2 = x * 2;long long x3 = x * 3;long long x5 = x * 5;if (!vis.count(x2)) { q.push(x2); vis.insert(x2); }if (!vis.count(x3)) { q.push(x3); vis.insert(x3); }if (!vis.count(x5)) { q.push(x5); vis.insert(x5); }}return x;
}//动态规划+三指针写法
//题目的本质目的,是从前面得到的数中,每个数乘2,3,5,然后求从小到大的第n个数
//由于需要从小到大,可以使用三个指针依次指向当前乘以2,3,5的数,选取其中最小的为丑数,并将指针向后移动一个
int nthUglyNumber2(int n) {int p2 = 1, p3 = 1, p5 = 1;vector<long long> dp(n + 1, 1);for (int i = 2; i <= n; ++i) {long long x2 = dp[p2] * 2;long long x3 = dp[p3] * 3;long long x5 = dp[p5] * 5;long long ugly = min(min(x2, x3), x5);if (ugly == x2) p2++;if (ugly == x3) p3++;if (ugly == x5) p5++;dp[i] = ugly;}return dp[n];
}
int main() {return 0;
}