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. For example, [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) 1 is a super ugly number for any given primes.
(2) The given numbers in primes are in ascending order.
(3) 0 < k ≤ 100, 0 < n ≤ 106, 0 < primes[i] < 1000.
解题思路:
有一个super ugly number序列,有一个prime序列,对于每一个prime[i], 有一个对应的指针pointer[i], prime[i] * ugly[pointer[i]]就是第i个质数下一个等待选取的数。
每次扫描一遍prime[i] * ugly[pointer[i]], 选一个最小的,那么最小的那个pointer[i]]就需要加1.
Note:对于第二个for循环:因为有可能出现多个prime[i]*ugly[pointer[i]] == min,所以必须完全扫描一遍,把所有pointer[min_i]都加1
public class Solution {
public int nthSuperUglyNumber(int n, int[] primes) {
int[] pointer = new int[primes.length];
int[] uglyNum = new int[n];
int cnt = 0;
uglyNum[cnt++] = 1;
int min = Integer.MAX_VALUE;
int minPointer = -1;
int lastUgly = -1;
while(cnt < n){
min = Integer.MAX_VALUE;
for (int i = 0; i < primes.length; i ++){
if (min > primes[i] * uglyNum[pointer[i]]){
min = primes[i] * uglyNum[pointer[i]];
}
}
uglyNum[cnt++] = min;
for (int i = 0; i < primes.length; i ++){
if (min == primes[i] * uglyNum[pointer[i]]){//注意,有可能出现多个j符合条件,则多个pointer[j]都要加
pointer[i] ++;
}
}
}
return uglyNum[n - 1];
}
}