leetcode 313. Super Ugly Number-超级丑数

原题链接:313. Super Ugly Number

【思路-Java、Python】

Ugly Number II极为相似,只不过这里将3个数扩展为k个数,解释核心代码的含义:

    minProduct[i] = superNumbers[indexs[i]] * primes[i];
primes[i]为第i个素数,minProduct[i]存放着以i为索引的素数为因子的最小乘积,另一个因子存放在以index[i]为索引的superNumbers中:

    public int nthSuperUglyNumber(int n, int[] primes) {
        int[] superNumbers = new int[n];
        int[] indexs = new int[primes.length];
        int[] minProduct = new int[primes.length];
        superNumbers[0] = 1;
        for (int i = 0; i < primes.length; i++)
            minProduct[i] = superNumbers[indexs[i]] * primes[i];
        int count = 1;
        while (count < n) {
            int minPrime = 0x7fffffff;
            for (int i = 0; i < primes.length; i++)
                minPrime = Math.min(minPrime, minProduct[i]);
            superNumbers[count++] = minPrime;
            for (int i = 0; i < primes.length; i++)
                if (minProduct[i] == minPrime)
                    minProduct[i] = superNumbers[++indexs[i]] * primes[i];
        }
        return superNumbers[n - 1];
    }
83 / 83  test cases passed. Runtime: 26 ms  Your runtime beats 87.95% of javasubmissions.

class Solution(object):
    def nthSuperUglyNumber(self, n, primes):
        """
        :type n: int
        :type primes: List[int]
        :rtype: int
        """
        candidates = [1]*len(primes)
        ids = [0]*len(primes)
        superNums = [1]
        nextMin = 1
        for count in range(1, n) :
            for i in range(len(primes)) :
                if nextMin == candidates[i] :
                    candidates[i] = superNums[ids[i]]*primes[i]
                    ids[i] += 1
            nextMin = min(candidates)
            superNums.append(nextMin)
        return superNums[-1]
83 / 83  test cases passed. Runtime: 484 ms  Your runtime beats 93.16% of pythonsubmissions.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值