313. Super Ugly Number
遍历
从小到大找ugly number,每个新的ugly number是primes中的素数乘积,必然是某个素数乘之前的某个ugly number。每个primes中的素数记录一个下标,对应将要乘的ugly number。每个primes中的素数,乘以之前的尽量小的ugly number,但如果之前某个ugly number能和该素数生成之前某个ugly number,则给该素数记录的接下来将要乘的ugly number下标+1。
注意INT_MAX和long long,测试数据较大。
class Solution {
public:
int nthSuperUglyNumber(int n, vector<int>& primes)
{
vector<int> ugly_vec(n);
int prime_num=primes.size();
vector<int> prime_multip_vec(prime_num,0);
ugly_vec[0]=1;
if(n==1)
return 1;
for(int i=1;i<n;++i)
{
// cout<<"i="<<i<<endl;
int min_val=INT_MAX;
for(int p_i=0;p_i<prime_num;++p_i)
{
if(prime_multip_vec[p_i]>i-1)
continue;
if(1ll*primes[p_i]*ugly_vec[prime_multip_vec[p_i]]>INT_MAX)
continue;
min_val=min(min_val,primes[p_i]*ugly_vec[prime_multip_vec[p_i]]);
// printf("p_i: %d, min_val: %d\n",p_i,min_val);
}
ugly_vec[i]=min_val;
for(int p_i=0;p_i<prime_num;++p_i)
{
if(prime_multip_vec[p_i]>i-1)
continue;
if(1ll*primes[p_i]*ugly_vec[prime_multip_vec[p_i]]>INT_MAX)
continue;
if(primes[p_i]*ugly_vec[prime_multip_vec[p_i]]==min_val)
++prime_multip_vec[p_i];
}
// cout<<min_val<<endl;
}
return ugly_vec[n-1];
}
};
优先队列
寻找第N个超丑数
本文介绍了一种高效算法,用于找出第N个超丑数。超丑数是指其所有质因数都在给定质数集合内的正整数。算法通过动态规划,维护一个指向先前超丑数的指针数组,确保每次生成的新超丑数是最小的可能值。需要注意的是,由于测试数据可能非常大,因此在实现中必须考虑数据溢出的问题。
3602

被折叠的 条评论
为什么被折叠?



