313. Super Ugly Number
Write a program to find the nthsuper ugly number.
Super ugly numbers are positive numbers whose all prime factors are in the given prime listprimes
of sizek
. For example,[1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32]
is the sequence of the first 12 super ugly numbers givenprimes
=[2, 7, 13, 19]
of size 4.
Note:
(1)1
is a super ugly number for any givenprimes
.
(2) The given numbers inprimes
are in ascending order.
(3) 0 <k
≤ 100, 0 <n
≤ 106, 0 <primes[i]
< 1000.
(4) The nth super ugly number is guaranteed to fit in a 32-bit signed integer.
S:merge sort O(NK)
新的ugly number都由primes乘以已有的ugly number构成,用merge sort顺序生成ugly number,每次将primes.size()个虚拟list中最小的数存储ugly number, 每个list首元素为ugly[index[j]] * primes[j],当队首元素存入ugly number时index[j]++
int nthSuperUglyNumber(int n, vector<int>& primes) {
int size = primes.size();
vector<int> ugly(n, INT_MAX), index(size, 0);
ugly[0] = 1;
for (int i = 0; i < n; ++i) {
for (int j = 0; j < size; ++j) {
ugly[i] = min(ugly[i], ugly[index[j]] * primes[j]);
}
for (int j = 0; j < size; ++j) { //merge进的表头进一位, 包括所有重复元素
if (ugly[i] == ugly[index[j]] * primes[j]) {
index[j]++;
}
}
}
return ugly[n - 1];
}
merge sort可由heap 优化为nlogk