313. Super Ugly Number
Medium
Write a program to find the nth super ugly number.
Super ugly numbers are positive numbers whose all prime factors are in the given prime list primes of size k.
Example:
Input: n = 12, primes = [2,7,13,19]
Output: 32
Explanation: [1,2,4,7,8,13,14,16,19,26,28,32] is the sequence of the first 12
super ugly numbers given primes = [2,7,13,19] of size 4.
Note:
1 is a super ugly number for any given primes.
The given numbers in primes are in ascending order.
0 < k ≤ 100, 0 < n ≤ 106, 0 < primes[i] < 1000.
The nth super ugly number is guaranteed to fit in a 32-bit signed integer.
题意
给定素数序列primes,求以这些素数为基的第n大的丑数。丑数的定义是质因子只含有primes中的素数的正整数。
思路
为primes中的每一个质因子设置一个指针,每次选取最小的候选人作为下一个丑数,同时对应素数的指针移动。设置pre记录上一个丑数,跳过与pre相同的候选人。
代码
class Solution {
public int nthSuperUglyNumber(int n, int[] primes) {
if (n == 1) {
return 1;
}
int p = primes.length;
int[] ptrs = new int[p], ugly = new int[n];
ugly[0] = 1;
int pre = 1, i = 0, j = 0, tmp = 0, minPtr = -1;
for (i=2; i<=n; ++i) {
ugly[i-1] = Integer.MAX_VALUE;
for (j=0; j<p; ++j) {
tmp = ugly[ptrs[j]] * primes[j];
if (tmp == pre) {
tmp = ugly[++ptrs[j]] * primes[j];
}
if (tmp < ugly[i-1]) {
ugly[i-1] = tmp;
minPtr = j;
}
}
++ptrs[minPtr];
pre = ugly[i-1];
}
return ugly[n-1];
}
}