超级丑数--堆+集合 or dp找规律
Posted C_YCBX Py_YYDS
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了超级丑数--堆+集合 or dp找规律相关的知识,希望对你有一定的参考价值。
题目
解法一:堆+集合
过程很简单就是通过最小堆得到每次选择操作后的最小值,再根据这个最小值扩散,如果过程中出现了重复的,就用set去重就可。
class Solution {
public:
int nthSuperUglyNumber(int n, vector<int>& primes) {
using ll = long long;
priority_queue<ll,vector<ll>,greater<ll> >Q;
unordered_set<ll>check;check.emplace(1);
Q.push(1);
int sz = primes.size();
int res;
while(n--){
res = Q.top();Q.pop();
for(int i=0;i<sz;i++){
if(!check.count((ll)res*primes[i])){
Q.push((ll)res*primes[i]);
check.emplace((ll)res*primes[i]);
}
}
}
return res;
}
};
解法二:动态规划==找规律解决
简而言之,就是每次取完一个值后便把这个值对应的指针往后移动。
class Solution {
public:
int nthSuperUglyNumber(int n, vector<int>& primes) {
int dp[n];
int sz = primes.size();
memset(dp,0,sizeof(dp));
dp[0] = 1;
int pointer[sz];memset(pointer,0,sizeof pointer);
for(int i=1;i<n;i++){
int res = INT_MAX;
for(int j=0;j<sz;j++){
res = min(dp[pointer[j]]*primes[j],res);
}
dp[i] = res;
//去重,指针偏移
for(int j=0;j<sz;j++){
if(dp[pointer[j]]*primes[j]==dp[i])
pointer[j]++;
}
}
return dp[n-1];
}
};
以上是关于超级丑数--堆+集合 or dp找规律的主要内容,如果未能解决你的问题,请参考以下文章
HDU - 4722 Good Numbers 找规律 or 数位dp模板
LeetCode 313. 超级丑数(最小堆动态规划)/413. 等差数列划分/167. 两数之和 II - 输入有序数组