原题链接: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.