寻找第n个丑数。
首先我们维护一个丑数的数组,所有的丑数必然是前面的某个丑数乘以primes数组里的某个数字得来。
所以我们在维护一个primes数组对应的最小丑数数组下标pos,primes[i]*pos[i] 就是未来的某个丑数,按照从小到大一个一个计算。
class Solution {
public:
int pos[105];
int ugly[1000005];
int nthSuperUglyNumber(int n, vector<int>& primes) {
if(primes.size()==0)
return 1;
for(int i=0;i<primes.size();i++)
{
pos[i]=1;
}
ugly[1]=1;
int ans=1;
for(int i=2;i<=n;i++)
{
int m = INT_MAX;
for(int j=0;j<primes.size();j++)
{
if(primes[j]==1)
continue;
if(m>primes[j]*ugly[pos[j]])
{
m=primes[j]*ugly[pos[j]];
}
}
for(int j=0;j<primes.size();j++)
{
if(primes[j]*ugly[pos[j]] == m)
{
pos[j]++;
}
}
if(m==INT_MAX)
m=1;
ugly[i]=m;
ans = m;
}
return ans;
}
};
LeetCode 313. Super Ugly Number
原文:https://www.cnblogs.com/dacc123/p/13047626.html