leetcode 313. Super Ugly Number

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];
    }
};

优先队列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值