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];
}
};
优先队列