地址https://leetcode-cn.com/problems/super-ugly-number/
解题思路
- 本题要求返回第n个超级丑数,我们知道1是第一个超级丑数,而任何一个超级丑数都可以通过前面的超级丑数乘以质数数组用的元素得到,所以可以采用多指针+备忘录思想,多指针实际存储的是当前索引值乘以指向备忘录形成一个超级丑数
- 注意:
1.指针更新可能存在多指针需要更新,避免备忘录中出现重复
class Solution {
public:
int nthSuperUglyNumber(int n, vector<int>& primes) {
// 多指针+动态规划(任何一个超级丑数都是由,之前的超级丑数乘以primes中的一个元素得到的)
if(n==1)return 1;
int length = primes.size();
vector<int>dp(n+1);//记录每一个丑数
dp[1] = 1;
vector<int>pnumbers(length,1);//初始默认次数为1都指向dp[1]
for(int i =2;i<=n;++i){
vector<int>tempnums(length);//记录临时相乘变量结果
int minnum = INT_MAX;
for(int j = 0;j<length;++j){
tempnums[j] = primes[j] * dp[pnumbers[j]];
minnum = min(tempnums[j],minnum);
}
dp[i] = minnum;//存储本次最小丑数
// 进行次数变更,这里可能存在同一批次生成相同的值,这里需要进行一起变更
for(int j =0;j<length;++j){
if (tempnums[j]==minnum){
pnumbers[j]++;
}
}
}
return dp[n];
}
};